js_脚本之家金沙8331网址

Restful风格的WebService正在逐步代替传统的SOAP, Java
也会有成都百货上千Restful的框架,很有益轻易,Jersey,restlet,以至SpringMVC也足以,不能不说Rest令人从Web转型到WebService更便于和方便,当然深切Restful的争辩依然察觉比较复杂的,可是,开拓和理论并无需那么的贴合,不常候伪Restful更加直观,可相信些。

前言

但是,作为超级帅的Node.js怎能够不和平等帅气的Restful相结合吗!?对于我们这种渺视理论的开采者来讲,Restful不就是url的业内+HTTP
method的正规而已嘛,所以Node这种很随意的技能以来,相像实现restful变的丰盛健康。不须求如何框架,不过笔者要么用了Express,Express只是对原生的http模块的一层封装而已,不要那么计较嘛!

Nodejs是三个青春的编制程序框架,充满了生气和最佳激情,平昔都在保障焦急忙更新。基于Nodejs的法定Web开辟库Express也在一块儿前行着,每年一次晋级一个大版本,以致对框架底层都做了大手術。在Express4时,替换掉中件间库connect,而改用两个越来越细粒度的库来替代。带给的低价是料定地,那几个中间件能更自由的翻新和揭露,不会晤前碰着Express公布周期的震慑;但难点也是很的高难,不相称于事情发生以前的版本,升级就表示要更正代码。

Java曾经是三个Xml配置文件横行的社会风气,未来是各样Annotation乱入的社会风气,固然注明的侵入性相当小,可是加了一摞申明的类也令人伤神,特别是各框架混杂的评释,幸而各大框架照旧比较自觉的,种种担任分裂的层,所以还不会招致各样表明的絮乱。好了,那么上边接待来到,未有评释,也没用xml的世界:

后边写过一篇文章“Nodejs开采框架Express3.0开拓手记–从零最初”,非常多新学Node的相恋的人都在参谋,但由于Express已经晋级,随笔中有一对的代码已经不可能动用,所以就有了那篇介绍Express4.x的稿子。

—-笔者是例证———

目录

var express = require //加载模块 var app = express() //实例化之 var map = {"1":{id:1,name:"test"},"2":{id:2,name:"test"}} //定义一个集合资源,key为字符串完全是模仿java MAP,否则谁会这么去写个hash啊! app.get('/devices',function{ //Restful Get方法,查找整个集合资源 res.set({'Content-Type':'text/json','Encodeing':'utf8'}); res.send app.get('/devices/:id',function{ //Restful Get方法,查找一个单一资源 res.set({'Content-Type':'text/json','Encodeing':'utf8'}); res.send //console.log app.post('/devices/', express.bodyParser{ //Restful Post方法,创建一个单一资源 res.set({'Content-Type':'text/json','Encodeing':'utf8'}); map[req.body.id] = req.body res.send({status:"success",url:"/devices/"+req.body.id}) //id 一般由数据库产生 }) app.put('/devices/:id', express.bodyParser{ //Restful Put方法,更新一个单一资源 res.set({'Content-Type':'text/json','Encodeing':'utf8'}); map[req.body.id] = req.body res.send({status:"success",url:"/devices/"+req.param,device:req.body}); }) app.delete('/devices/:id',function{ //Restful Delete方法,删除一个单一资源 res.set({'Content-Type':'text/json','Encodeing':'utf8'}); delete map[req.param] res.send({status:"success",url:"/devices/"+req.param console.log app.listen; //监听8888端口,没办法,总不好抢了tomcat的8080吧! 
  1. 创立工程
  2. 目录构造
  3. package.json项目配置
  4. app.js大旨文件
  5. Bootstrap界面框架
  6. 路由功效
  7. 程序代码
  8. Express3.x和Express4.x的改造列表

  9. 树立项目

———小编是测量检验———–


用Postman测验ok, 代码中独一令人离奇的应有是delete
map[req.param],我们通晓js的map是三个Object,或许Object是三个map,,delete
object.property,能够去除这么些天性,可是delete
Object[Property]金沙8331网址,也能够把那些性格给干掉,delete o.x 也得以创作 delete
o[“x”],两个效果同样 关于delete请观察:ECMAScript delete!

让我们以前开首Express4.x的设置和采用啊,安装Node和NPM在本文就非常少说了。Linux情状设置请参见文章,计划Nodejs开垦条件Ubuntu,Window碰到安装间接下载Node的安装文件,双击安装就行了。

系不系很平价哈!和那二个XXX框架些的代码很形似啊!借令你是三个谋求不相同的人,Node.js当然也满意你,平素饱受争论的路由表上台了:

作者的体系情状

——我是另一个文书:routes.js——–

  • Win7 64bit
  • Nodejs:v0.10.31
  • Npm:1.4.23
{ get: [ { path: '/', method: 'get', callbacks: [Object], keys: [], regexp: /^//?$/i }, { path: '/user/:id', method: 'get', callbacks: [Object], keys: [{ name: 'id', optional: false }], regexp: /^/user//?$/i } ], delete: [ { path: '/user/:id', method: 'delete', callbacks: [Object], keys: [Object], regexp: /^/user//?$/i } ] } 

先是,大家供给安装express库。在Express3.6.x从前的版本,Express必要全局安装的,项目创设器模块是联合在Express项目中的,后来以此创设器被拆分出来,独立成为了二个项目express-generator,未来我们只要求全局安装express-generator项目就行了。

概念这么三个目的,然后

~ npm install -g express-generator@4  #全局安装-g
C:UsersAdministratorAppDataRoamingnpmexpress -> C:UsersAdministratorAppDataRoamingnpmnode_modulesexpress-ge
neratorbinexpress

express-generator@4.11.2 C:UsersAdministratorAppDataRoamingnpmnode_modulesexpress-generator
├── sorted-object@1.0.0
├── commander@2.6.0
└── mkdirp@0.5.0 (minimist@0.0.8)
var routes = require app.use;//保留原来的 routes;//这个是新加的,将前者作为默认路由 

设置好express-generator包后,大家在命令行就足以使用express命令了。

关于routes的更加多内容:Express官方网址可靠些,毕竟node.js最大的难点,便是材料的api都太旧了!

~ express -V # 检查express的版本
4.11.2

~ express -h  # 检查看express的帮助命令
  Usage: express [options] [dir]
  Options:
    -h, --help          output usage information
    -V, --version       output the version number
    -e, --ejs           add ejs engine support (defaults to jade)
        --hbs           add handlebars engine support
    -H, --hogan         add hogan.js engine support
    -c, --css   add stylesheet  support (less|stylus|compass) (defaults to plain css)
        --git           add .gitignore
    -f, --force         force on non-empty directory

Node.js管理央浼包含其它一些Io都以异步的,一点也不慢,所以对于质量,作者是相比看好的,关于Ab测量检验的结果,还在测,一言以蔽之笔者梦想可以秒杀tomcat!

接下去,大家使用express的吩咐,来成立项目了。

上述便是本文的全体内容,希望对大家的就学抱有利于,也盼望大家多多支持脚本之家。

~ cd D:workspacejavascript  # 进入工作目录

~ D:workspacejavascript>express -e nodejs-demo  # 创建项目
   create : nodejs-demo
   create : nodejs-demo/package.json
   create : nodejs-demo/app.js
   create : nodejs-demo/public/javascripts
   create : nodejs-demo/public/images
   create : nodejs-demo/public
   create : nodejs-demo/public/stylesheets
   create : nodejs-demo/public/stylesheets/style.css
   create : nodejs-demo/views
   create : nodejs-demo/views/index.ejs
   create : nodejs-demo/views/error.ejs
   create : nodejs-demo/routes
   create : nodejs-demo/routes/index.js
   create : nodejs-demo/routes/users.js
   create : nodejs-demo/bin
   create : nodejs-demo/bin/www

   install dependencies:
     $ cd nodejs-demo && npm install
   run the app:
     $ DEBUG=nodejs-demo:* ./bin/www

进去项目目录,下载重视库,营造项目。

~ D:workspacejavascript>cd nodejs-demo && npm install

开发银行项目。

~ D:workspacejavascriptnodejs-demo>npm start

> express4-demo@0.0.0 start D:workspacejavascriptnodejs-demo
> node ./bin/www

module.js:338
    throw err;
          ^
Error: Cannot find module './routes/users'
    at Function.Module._resolveFilename (module.js:336:15)
    at Function.Module._load (module.js:278:25)
    at Module.require (module.js:365:17)
    at require (module.js:384:17)
    at Object. (D:workspacejavascriptnodejs-demoapp.js:9:13)
    at Module._compile (module.js:460:26)
    at Object.Module._extensions..js (module.js:478:10)
    at Module.load (module.js:355:32)
    at Function.Module._load (module.js:310:12)
    at Module.require (module.js:365:17)

首先次开发银行发生了不当,大概是express-generator和express不匹配变成的,找到标题在app.js文件中,注释第9行和第26行。

..
//var users = require('./routes/users');
..
//app.use('/users', users);       
..

重复启航项目。

D:workspacejavascriptnodejs-demo>npm start
> express4-demo@0.0.0 start D:workspacejavascriptnodejs-demo
> node ./bin/www

花色运转成功,伸开浏览器

金沙8331网址 1

如此特别简单地,大家就把一个最大旨的Web应用做好了,正是几条命令而已。

2. 目录构造

接下去,大家详细看一下Express4类其他布局、配置和利用。

  • bin, 存放运行项目标剧本文件
  • node_modules, 寄放全体的品种信赖库。
  • public,静态文件(css,js,img卡塔尔
  • routes,路由文件(MVC中的C,controller卡塔尔(قطر‎
  • views,页面文件(Ejs模板State of Qatar
  • package.json,项目重视配置及开垦者音信
  • app.js,应用为主配置文件

金沙8331网址 2

3. package.json项目安顿

package.json用于项目重视配置及开拓者消息,scripts属性是用于定义操作命令的,能够拾贰分便于的加码运行命令,举个例子暗许的start,用npm
start代表施行node ./bin/www命令。

查看package.json文件。

{
  "name": "express4-demo",
  "version": "0.0.0",
  "private": true,
  "scripts": {
    "start": "node ./bin/www"
  },
  "dependencies": {
    "body-parser": "~1.10.2",
    "cookie-parser": "~1.3.3",
    "debug": "~2.1.1",
    "ejs": "~2.2.3",
    "express": "~4.11.1",
    "morgan": "~1.5.1",
    "serve-favicon": "~2.2.0"
  }
}

4. app.js大旨文件

从Express3.x晋级到Express4.x,首要的退换就在app.js文件中。查看app.js文件,笔者早已扩展注释表达。

// 加载依赖库,原来这个类库都封装在connect中,现在需地注单独加载
var express = require('express'); 
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');

// 加载路由控制
var routes = require('./routes/index');
//var users = require('./routes/users');

// 创建项目实例
var app = express();

// 定义EJS模板引擎和模板文件位置,也可以使用jade或其他模型引擎
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');

// 定义icon图标
app.use(favicon(__dirname + '/public/favicon.ico'));
// 定义日志和输出级别
app.use(logger('dev'));
// 定义数据解析器
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
// 定义cookie解析器
app.use(cookieParser());
// 定义静态文件目录
app.use(express.static(path.join(__dirname, 'public')));

// 匹配路径和路由
app.use('/', routes);
//app.use('/users', users);

// 404错误处理
app.use(function(req, res, next) {
    var err = new Error('Not Found');
    err.status = 404;
    next(err);
});

// 开发环境,500错误处理和错误堆栈跟踪
if (app.get('env') === 'development') {
    app.use(function(err, req, res, next) {
        res.status(err.status || 500);
        res.render('error', {
            message: err.message,
            error: err
        });
    });
}

// 生产环境,500错误处理
app.use(function(err, req, res, next) {
    res.status(err.status || 500);
    res.render('error', {
        message: err.message,
        error: {}
    });
});

// 输出模型app
module.exports = app;

咱俩看看在app.js中,原本调用connect库的部分都被别的的库所代替,serve-favicon、morgan、cookie-parser、body-parser,暗中同意项目中,只用到了最基本的几个库,还从未其他急需替换的库,在本文最后有详尽列出。

除此以外,原来用于项目运营代码也被移到./bin/www的文书,www文件也是贰个node的台本,用于抽离配置和起步程序。

查看./bin/www文件。

#!/usr/bin/env node   

/**
 * 依赖加载
 */
var app = require('../app');
var debug = require('debug')('nodejs-demo:server');
var http = require('http');

/**
 * 定义启动端口
 */
var port = normalizePort(process.env.PORT || '3000');
app.set('port', port);

/**
 * 创建HTTP服务器实例
 */
var server = http.createServer(app);

/**
 * 启动网络服务监听端口
 */
server.listen(port);
server.on('error', onError);
server.on('listening', onListening);

/**
 * 端口标准化函数
 */
function normalizePort(val) {
  var port = parseInt(val, 10);
  if (isNaN(port)) {
    return val;
  }
  if (port >= 0) {
    return port;
  }
  return false;
}

/**
 * HTTP异常事件处理函数
 */
function onError(error) {
  if (error.syscall !== 'listen') {
    throw error;
  }

  var bind = typeof port === 'string'
    ? 'Pipe ' + port
    : 'Port ' + port

  // handle specific listen errors with friendly messages
  switch (error.code) {
    case 'EACCES':
      console.error(bind + ' requires elevated privileges');
      process.exit(1);
      break;
    case 'EADDRINUSE':
      console.error(bind + ' is already in use');
      process.exit(1);
      break;
    default:
      throw error;
  }
}

/**
 * 事件绑定函数
 */
function onListening() {
  var addr = server.address();
  var bind = typeof addr === 'string'
    ? 'pipe ' + addr
    : 'port ' + addr.port;
  debug('Listening on ' + bind);
}

5. Bootstrap分界面框架

始建Bootstrap分界面框架,直接在index.ejs文件上边做修正。可以手动下载Bootstrap库放到项目中对应的地点援用,也可以透过bower来保管前端的Javascript库,参考作品 bower肃清js的注重管理。其它还足以一向利用免费的CDN源加载Bootstrap的css和js文件。上面作者就直接运用Bootcss社区提供的CDN源加载Bootstrap。

编辑views/index.ejs文件

<!DOCTYPE html>
<html lang="zh-CN">
  <head>
    <title><%= title %></title>
    <link rel="stylesheet" href="http://cdn.bootcss.com/bootstrap/3.3.2/css/bootstrap.min.css">
    <link rel='stylesheet' href='/stylesheets/style.css' />
  </head>
  <body>
    <div class="well jumbotron">
      <h1><%= title %></h1>
      <p>This is a simple hero unit, a simple jumbotron-style component for calling extra attention to featured content or information.</p>
      <p><a class="btn btn-primary btn-lg" href="#" role="button">Learn more</a></p>
    </div>
    <script src="http://cdn.bootcss.com/jquery/1.11.2/jquery.min.js"></script>
    <script src="http://cdn.bootcss.com/bootstrap/3.3.2/js/bootstrap.min.js"></script>
  </body>
</html>

效率如下,已经进入了bootstrap的样式了。

金沙8331网址 3

接下去,大家把index.ejs页面切分成3个部分:header.ejs, index.ejs,
footer.ejs,用于网址页面的模块化。

  • header.ejs, 为页面包车型的士头顶区域
  • index.ejs, 为内容彰显区域
  • footer.ejs,为页面尾部区域

编辑header.ejs。

<!DOCTYPE html>
<html lang="zh-CN">
  <head>
    <title><%= title %></title>
    <link rel="stylesheet" href="http://cdn.bootcss.com/bootstrap/3.3.2/css/bootstrap.min.css">
    <link rel='stylesheet' href='/stylesheets/style.css' />
  </head>
  <body>

编辑footer.ejs。

    <script src="http://cdn.bootcss.com/jquery/1.11.2/jquery.min.js"></script>
    <script src="http://cdn.bootcss.com/bootstrap/3.3.2/js/bootstrap.min.js"></script>
  </body>
</html>

编辑index.ejs。

<% include header.ejs %>

<div class="well jumbotron">
<h1><%= title %></h1>
<p>This is a simple hero unit, a simple jumbotron-style component for calling extra attention to featured content or information.</p>
<p><a class="btn btn-primary btn-lg" href="#" role="button">Learn more</a></p>
</div>

<% include footer.ejs %>

把页表和页底的代码分离后,让index.ejs页面包车型客车中坚代码越来越少,更易于保险。

6. 路由功能

路由功效,是Express4未来周到改版的效率。在应用程序加载隐含路由中间件,不用忧郁在中间件棉被服装载相对于路由器中间件的逐一。定义路由的措施是不改变的,路由系统中加进2个新的效劳。

  • app.route(卡塔尔函数,创设可链接的门道管理程序的路由路线。
  • express.Router类,创制模块化安装路线的管理程序。

app.route方法会重返一个Route实例,它可以三番三遍利用具备的HTTP方法,包含get,post,all,put,delete,head等。

app.route('/users')
  .get(function(req, res, next) {})
  .post(function(req, res, next) {})

express.Router类,则足以帮助咱们更加好的组织代码布局。在app.js文件中,定义了app.use(‘/’,
routesState of Qatar;
routes是指向了routes目录下的index.js文件,./routes/index.js文件中,express.Router被定义使用,路线/*拍卖都会由routes/index.js文件里的Router来管理。借使大家要保管分歧的门径,那么能够直接配备为多少个例外的Router。

app.use('/user', require('./routes/user').user);
app.use('/admin', require('./routes/admin').admin);
app.use('/', require('./routes'));

7. 程序代码

对于刚先生接触Express4.x的敌人,能够直接从Github上边下载本文项目中的源代码,依据片文章中的介绍学习Express4,下载地址:

也能够一向用github命令行来下载:

~ git clone git@github.com:bsspirit/nodejs-demo.git   # 下载github项目
~ cd nodejs-demo                                      # 进入下载目录
~ git checkout express4                               # 切换到express4的分支
~ npm install                                         # 下载依赖库
~ npm start                                           # 启动服务器

注:Github上本项目有3拨出,express3和master分支都以express3的例证,express4分支是本文的例证。

本来,本文对express4的牵线其实还贫乏,除了文中聊到的express校正的部分,别的的部分都express3好像,所以更详细的应用表明,还请大家还要参照他事他说加以考察小说,Nodejs开辟框架Express3.0开垦手记–从零开头 来一同念书。

发表评论

电子邮件地址不会被公开。 必填项已用*标注