express4.x新特性以及如何从3.x升级到4.x
express4.x新特性以及如何从3.x升级到4.x
1 移除内置中间件
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 | 
|---|---|
| bodyParser | body-parser | 
| compress | compression | 
| cookieSession | cookie-session | 
| logger | morgan | 
| cookieParser | cookie-parser | 
| session | express-session | 
| favicon | serve-favicon | 
| response-time | response-time | 
| error-handler | errorhandler | 
| method-override | method-override | 
| timeout | connect-timeout | 
| vhost | vhost | 
| csrf | csurf | 
| directory | serve-index | 
| static | serve-static | 
2 强化的路由功能
4.x提供了一个更棒的 Router 对象和 route 接口,可以更方便的把路由分解成单独的文件
不要再手动执行 app.use(app.routers) , app.use和app[get post]混用的时候,将会按照它们调用的顺序执行
app.use(cookieParser());
app.use(bodyParser());
/// .. other middleware .. doesn't matter what
app.use(app.router); // **不需要这句话了
// more middleware (executes after routes)
app.use(function(req, res, next) {});
// error handling middleware
app.use(function(err, req, res, next) {});
app.get('/' ...);
app.post(...);
换成了4.x的:
app.use(cookieParser());
app.use(bodyParser());
/// .. other middleware .. doesn't matter what
app.get('/' ...);
app.post(...);
// more middleware (executes after routes)
app.use(function(req, res, next) {});
// error handling middleware
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) {})
3. 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 的内容可以看 文档
4. 删除app.configure方法
这个方法使用还是比较多的,如果你用来判断环境的代码,比如3.x下的
3.x
app.configure('development', function() {
   // configure stuff here
});
在4.x下,这个方法完全没有了,你需要换成
var env = process.env.NODE_ENV || 'development';
if ('development' == env) {
   // configure stuff here
}
5. 删除express.createServer()
这个在3.x的时代就已经废弃了,直接使用 express()就行了
6. 删除res.charset
使用 res.set('content-type') 或者 res.type() 来设置默认的charset,使用 res.setHeader 时不会再默认加charset了
7. req.accepted改为req.accepts
- req.accepts()
 - req.acceptsEncodings()
 - req.acceptsCharsets()
 - req.acceptsLanguages()
 
8 .req.params的改变
这个属性现在是一个对象,不再是一个数组
9 res.locals
不再是一个方法,现在它就是一个纯对象,只用来数据
10 req.is
去掉了,可以使用 type-is模块
总的来说,改动还是挺大的,如果你想升级,最好留有足够的时间来把你的代码调整为4.x的。
如果发现这篇文章里有什么错误,欢迎留言反馈。
喜欢看英文的朋友,可以直接看下面的文章:
本文为博主原创文章,转载请注明出自 博客园蓝波大人 并保留本文有效链接 ,转载请保留本声明!谢谢

                
            
        
浙公网安备 33010602011771号