Express.js 4 ( http://expressjs.com)是针对 web 应用、服务和 API 的最流行、最成熟、最健壮的 Node.js 框架的最新(截至 2014 年 5 月)主要版本。在从 3.x 到 4.x 的过渡中有一些突破性的变化,因此本附录作为一个简短的迁移指南,包括以下内容:
- 在 Express.js 4 中引入非捆绑中间件
- 从 Express.js 4 应用中删除不推荐使用的方法
- Express.js 4 的其他更改
- 探索新的 Express.js 4 路由实例以及如何链接它
- 更多 Express.js 4 迁移阅读链接
即使您不打算使用版本 3,本指南也可能对您有用,因为它阐明了从 Express 3 到 4 进行更改的基本原理,以及这些更改背后的哲学。
在 Express.js 4 中引入非捆绑中间件
让我们从最大的改变开始,这个改变将打破你的大多数 Express.js 3.x 项目。这也是讨论最多的(也是期待已久的?)网上的 Express.js 新闻。是的,它是非捆绑的中间件。
就我个人而言,我不确定这是好消息还是坏消息,因为我喜欢不必声明额外的依赖项。然而,我也看到了支持非绑定的理由,包括好处,比如保持 Express.js 模块小,独立升级中间件包,等等。
那么,什么是非捆绑中间件呢?还记得我们能够简单地通过键入app.use(express.middlwarename())来使用的神奇中间件吗?嗯,它们来自于Connect库,但现在它们不再是 Express.js 的一部分。例如,习惯上用 Express.js 3.x 编写app.use(express.cookieParser())。这些模块对于几乎任何 web 应用都是必不可少的。它们是Connect库的一部分,但是 Express.js 4.x 没有Connect作为依赖项。这意味着,如果我们想使用中间件(我们确实这么做了!),我们需要明确地包含中间件,就像这样:
$ npm install body-parse@1.0.2 --save然后,在 Express.js 主配置文件(如app.js)中,我们这样使用包含的模块:
var bodyParser = require('body-parse')
// ... other dependencies
app.use(bodyParser())
// ... some other Express.js app configuration表 B-1 描述了开发人员将不得不替换的非捆绑中间件:除了静态之外的所有中间件。没错,静电被遗漏了(为了方便?).下表列出了 Express.js 3.x 中间件名称及其在 Express.js 4.x 中的 NPM 模块对应项。
表 B-1 。中间件比较
|
Express.js 3.x
|
Express.js 4.x
|
github link(github 链接)
|
| --- | --- | --- |
| express.bodyParser | body-parser | https://github.com/expressjs/body-parser |
| express.compress | compression | https://github.com/expressjs/compression |
| express.timeout | connect-timeout | https://github.com/expressjs/timeout |
| express.cookieParser | cookie-parser | https://github.com/expressjs/cookie-parser |
| express.cookieSession | cookie-session | https://github.com/expressjs/cookie-session |
| express.csrf | csurf | https://github.com/expressjs/csurf |
| express.error-handler | errorhandler | https://github.com/expressjs/errorhandler |
| express.session | express-session | https://github.com/expressjs/session |
| express.method-override | method-override | https://github.com/expressjs/method-override |
| express.logger | morgan | https://github.com/expressjs/morgan |
| express.response-time | response-time | https://github.com/expressjs/response-time |
| express.favicon | serve-favicon | https://github.com/expressjs/serve-favicon |
| express.directory | serve-index | https://github.com/expressjs/serve-index |
| express.static | serve-static | https://github.com/expressjs/serve-static |
| express.vhost | vhost | https://github.com/expressjs/vhost |
让事情变得更复杂的是,Express.js/Connect 团队放弃了对表 B-2 中所示模块的支持,并建议您使用替代方案:
表 B-2 。丢弃模块及其替代品
|丢弃的模块
|
可供选择的事物
|
| --- | --- |
| cookieParser | cookies和keygrip |
| limit | 生体 |
| multipart | connect-multiparty和connect-busboy |
| query | qs |
| staticCache | st和connect-static |
这些未捆绑的 Express.js/Connect 模块很多都需要维护者1;这是您在 Node.js 领域取得进展的机会!
从 Express.js 4 应用中删除不推荐使用的方法
本节讨论那些不推荐使用的方法以及如何替换它们。
app.configure()
大多数人可能从来没有使用过app.configure(),这是一个很好但不重要的方法,主要用于设置环境。如果你用过,就把app.configure('name', function(){...})换成if (process.env.NODE_ENV === 'name') {...}。例如,这个旧的 Express.js 3 生产配置
app.configure('production', function() {
app.set('port', 80)
})在 Express.js 4.x 中变成以下内容:
if (process.env.NODE_ENV === 'production') {
app.set('port', 80)
}app .路由
Express.js 4 的一个好的变化是它不再需要编写app.router!所以现在,基本上,中间件和路由的顺序是唯一重要的事情,而在 Express.js 3x 中,开发人员可以通过将app.router放在中间的某个位置来增加执行的顺序。
如果您有任何应该在路由之后订购的中间件,那么将它移动到路由之后的*,按照您想要的顺序。*
例如,在 Express.js 3.x 配置中的路由之后执行的错误处理中间件:
app.use(express.cookieParser())
app.use(app.router)
app.use(express.errorHandler())
app.get('/', routes.index)
app.post('/signup', routes.signup)在 Express.js 4.x 中迁移到以下代码:
var cookieParse = require('cookie-parser')
var errorHandler = require('errorhandler')
...
app.use(cookieParser())
app.get('/', routes.index)
app.post('/signup', routes.signup)
app.use(errorHandler())换句话说,app.use()和带动词的路线,如app.get()、app.post()、app.put()、app.del()成了对等物。
res.on(“标题”)
从 Connect 3 中移除了res.on('header')事件。
res.charset
在 Express.js 4.x 中,用res.type()或res.set('content-type')代替 Express.js 3.x 中的res.charset
利斯特 headersent
在 Express.js 4.x 中,用res.headersSent代替res.headerSent。
req.accepted()
在 Express.js 4.x 中,用req.accepts()代替req.accepted()。
Express.js 4.x 中的req.accepts由模块accepts ( https://github.com/expressjs/accepts)提供支持,GitHub 文档表明该模块是从 Koa ( http://koajs.com)中提取的,用于一般用途。
Express.js 4 的其他更改
本节介绍了 Express.js 4 的其他一些变化。
app.use()
令人惊讶的是,app.use()现在接受 URL 参数。这是使app.use()和动词 route 方法相等并减少混淆的又一步。参数在req.params对象中。
例如,如果我们需要从 URL 获得一个 ID,在 Express.js 4.x 中间件中我们可以写
app.use('/posts/:slug', function(req, res, next) {
req.db.findPostBySlug(req.params.slug, function(post){
...
})
})资源位置()
在 Express.js 4 中,res.location()不再解析相对 URL。
app.route()
参见下一节“探索新的 Express.js 4 Route 实例以及如何链接它”,了解关于 Express.js 4 中app.route()角色的详细信息。
json 空间
在 Express.js 4 中,json spaces在开发中默认是关闭的。
请求参数
req.params是对象,不是数组。
没有.本地
res.locals现在是一个物体。
req.is
Express.js 4.x 中的req.is已经被模块type-is ( https://github.com/expressjs/type-is)所取代,根据 GitHub 文档,该模块也是从 Koa.js ( http://koajs.com)中提取出来用于一般用途。
Express.js 命令行生成器
对于命令行生成器,请使用
$ sudo npm install -g express-generator而不是普通的老式$ sudo npm install -g express。
探索新的 Express.js 4 路由实例以及如何链接它
app.route()方法为我们提供了新的 Express.js 4 route 实例。在探究之前,我们先来看看路由本身。
在 Express.js 4.x 中,Router类得到了增强。在 Express.js 3.x 中,app 实例使用 router,但现在我们可以创建许多 route 实例,并通过附加特定的中间件和其他逻辑将它们用于特定的路径。这可以用来重组代码。
这里有一个开发者如何在 Express.js 4.x 中使用Router的基本例子,假设我们有两个类别的评论:书籍和游戏。审查的逻辑类似于路由,并被打包成路由:
var express = require('express')
var app = express()
var router = express.Router()
router.use(function(req, res, next) {
//process each request
});
router.get('/', function(req, res, next) {
// get the home page for that entity
next();
});
router.get('/reviews', function(req, res, next) {
// Get the reviews for that entity
next();
});
app.use('/books', router);
app.use('/games', router);
app.listen(3000);app.route()或router.route()返回新的 Express.js 4.x route 实例,我们可以这样链:
router.route('/post/:slug')
.all(function(req, res, next) {
// Runs each time
// We can fetch the post by id from the database
})
.get(function(req, res, next) {
//Render post
})
.put(function(req, res, next) {
//Update post
})
.post(function(req, res, next) {
//Create new comment
})
.del(function(req, res, next) {
//Remove post
})在 Express.js 3.x 中,如果没有路由链,我们将不得不反复输入相同的路径(增加了输入错误的风险):
router.all('/post/:slug', function(req, res, next) {
// runs each time
// we can fetch the post by ID from the database
})
router.get('/post/:slug', function(req, res, next) {
//render post
})
router.put('/post/:slug', function(req, res, next) {
//update post
})
router.post('/post/:slug', function(req, res, next) {
//create new comment
})
router.delete('/post/:slug', function(req, res, next) {
//remove post
})同一个路由实例也可以有自己的中间件、param 和 HTTP 动词方法(如上所示)。
更多 Express.js 4 迁移阅读链接
所以,总的来说,Express.js 4.x 的变化不是很大,而且迁移可能是一个相对轻松的过程。但是,在您点击$ git checkout -b express4为从 3.x 到 4.x 的迁移创建一个新的 Git 分支express4之前,请仔细考虑您是否真的需要迁移!我知道许多成功的生产应用没有更新它们的主框架版本。在 Storify,我们曾经在 3.x 可用的时候运行 Express.js 2.x,也不是什么大事。作为另一个例子,从 Ruby 世界来看,我知道许多应用和开发人员仍然在使用 Ruby on Rails 2.x,尽管 Ruby on Rails 4.x 已经推出。
如果您决定使用 Express.js 4,不要仅仅依赖这个简单的概述。看看这些额外的资源,帮助您更轻松地从 Express.js 3.x 过渡到 4.x:
Express.js 4、Node.js 和 MongoDB REST API 教程 5
1T0】
2T0】
3T0】
4T0】
5T0】