Skip to content

Latest commit

 

History

History
324 lines (214 loc) · 11.3 KB

File metadata and controls

324 lines (214 loc) · 11.3 KB

二十四、附录 B:将 Express.js 3.x 迁移到 4.x:中间件、路由和其他变化

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 | cookieskeygrip | | limit | 生体 | | multipart | connect-multipartyconnect-busboy | | query | qs | | staticCache | stconnect-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:

  • 官方迁移指南 2
  • Express.js 中的新功能 4 . xT1】3T3】
  • Express.js 4.x 文档 4

Express.js 4、Node.js 和 MongoDB REST API 教程 5


1T0】

2T0】

3T0】

4T0】

5T0】