express4.x新特性以及如何从3.x升级到4.x

距离我写 expressx2.x升级3.x 已经过去一年多的时间了,这期间express发展很迅速,已经是nodejs社区事实上的web框架之王。最近express发布了 4.0.0-rc3 ,其中又有了一些改变,下面我们来看看有哪些改变,以及如何从3.x升级到4.x。

移除内置中间件

4.x版本不再依赖Connect,之前内置的所有中间件除了 static 都被分离为单独的模块了,也就是如果你的3.x的代码是:

app.configure(function() { app.use(express.static(__dirname + '/public')); app.use(express.logger('dev')); app.use(express.bodyParser()); app.use(express.methodOverride()); });

在4.x各个模块需要单独安装,然后 require ,可以使用 npm install --save xxxx ,这样可以自动把模块保存到你的package.json 里,4.x的代码示例:

var app = express(); var express = require('express'); var morgan = require('morgan'); //logger模块的这个新名字真是神奇 var bodyParser = require('body-parser'); var methodOverride = require('method-override'); app.use(express.static(__dirname + '/public')); app.use(morgan('dev')); app.use(bodyParser()); app.use(methodOverride());

下面是3.x的内置模块和4.x模块的对照表,你可以发现,模块名有点混乱,有的是把驼峰改成了连字符,有的是反过来的,有的前缀express,有的是没有,真不知道怎么命名的,这个应该好好跟grunt或者gulp学习一下。

3.x4.x
bodyParserbody-parser
compresscompression
cookieSessioncookie-session
loggermorgan
cookieParsercookie-parser
sessionexpress-session
faviconserve-favicon
response-timeresponse-time
error-handlererrorhandler
method-overridemethod-override
timeoutconnect-timeout
vhostvhost
csrfcsurf
directoryserve-index
staticserve-static

强化的路由功能

4.x提供了一个更棒的 Router 对象和 route 接口,可以更方便的把路由分解成单独的文件

不要再手动执行 app.use(app.routers) , app.use和app[get|post]混用的时候,将会按照它们调用的顺序执行

例如有一个3.x的代码

app.use(cookieParser()); app.use(bodyParser()); app.use(app.router); // 这行要干掉 // 在路由之后执行 app.use(function(req, res, next); // 错误处理的中间件 app.use(function(err, req, res, next) {}); //正常的路由挂载 app.get('/' ...); app.post(...);

换成了4.x的:

app.use(cookieParser()); app.use(bodyParser()); //正常的路由挂载, 这里和app.use混用的时候 //如果需要中间件调用之前处理就必须use之前挂载 app.get('/' ...); app.post(...); // 在路由之后执行 app.use(function(req, res, next); // 错误处理的中间件 app.use(function(err, req, res, next) {});

4.x更方便的路由, app.route方法会返回一个Route实例,它可以继续使用所有的HTTP方法,并且它还有一个 all 方法,可以在所有的HTTP方法上生效

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

Router 对象

这是4.x里新增加的一个对象,它有点像迷你版的 app 对象,它没有 views 和 setting ,但是包含所有的路由接口,比如 .use ,.route .param .get 

它可以帮助我们更好组织代码,假如项目里有个 routes/people.js

var people = express.Router(); people.use(function(req, res, next) { }); people.get('/', function(req, res, next) { });

可以把它挂在 /people 下,所有的 /people/* 处理都会由 people.js 里的 Router 来处理了

app.use('/people', require('./routes/people').people);

更多关于 Router 的内容可以看 文档

删除app.configure方法

这个方法使用还是比较多的,如果你用来判断环境的代码,比如3.x下的

app.configure('development', function() { // configure stuff here });

在4.x下,这个方法完全没有了,你需要换成

var env = process.env.NODE_ENV || 'development'; if ('development' == env) { // configure stuff here }

删除express.createServer()

这个在3.x的时代就已经废弃了,直接使用 express() 就行了

删除res.charset

使用 res.set('content-type') 或者 res.type() 来设置默认的charset,使用 res.setHeader 时不会再默认加charset了

req.accepted改为req.accepts

有几个相关的方法都改名了

  • req.accepts()
  • req.acceptsEncodings()
  • req.acceptsCharsets()
  • req.acceptsLanguages() 

req.params的改变

这个属性现在是一个对象,不再是一个数组

res.locals

不再是一个方法,现在它就是一个纯对象,只用来数据

req.is

去掉了,可以使用 type-is 模块

总结

总的来说,改动还是挺大的,如果你想升级,最好留有足够的时间来把你的代码调整为4.x的。

相关链接:

http://www.expressjs.com.cn/4x/api.html

http://jser.me/2012/12/10/Express2.X%E8%BF%81%E7%A7%BB%E8%87%B33.X%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9.html

注:转载自http://ju.outofmemory.cn/entry/69541

转载于:https://www.cnblogs.com/iotpro/p/7822004.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值