8.转到Express 4 | 8. Moving to Express 4

转移到Express 4

概述

Express 4区别于Express 3有重大改变。这意味着如果您依赖于更新Express版本,现有的Express 3应用程序将无法工作。

本文涵盖:

  • Express 4中的更改

  • 将Express 3应用程序迁移到Express 4的示例。

  • 升级到Express 4应用程序生成器。

Express 4中的更改

Express 4有几个重大变化:

  • Express核心和中间件系统的变化。Connect和内置中间件的依赖关系已被删除,因此您必须自己添加中间件。

  • 路由系统的变化。

  • 各种其他变化。

也可以看看:

Express核心和中间件系统的变化

Express 4不再依赖于Connect,并从内核中移除所有内置中间件,express.static功能除外。这意味着Express现在是一个独立的路由和中间件Web框架,Express版本和发行版不受中间件更新的影响。

没有内置的中间件,您必须明确添加运行您的应用程序所需的所有中间件。只需遵循以下步骤:

  • 安装模块: npm install --save <module-name>

2. 在你的应用中,需要模块: require('module-name')

3. 根据其文档使用该模块: app.use( ... )

下表列出了Express 4中的Express 3中间件及其对应件。

Express 3Express 4
express.bodyParserbody-parser + multer
express.compresscompression
express.cookieSessioncookie-session
express.cookieParsercookie-parser
express.loggermorgan
express.sessionexpress-session
express.faviconserve-favicon
express.responseTimeresponse-time
express.errorHandlererrorhandler
express.methodOverridemethod-override
express.timeoutconnect-timeout
express.vhostvhost
express.csrfcsurf
express.directoryserve-index
express.staticserve-static

以下是Express 4中间件的完整列表

在大多数情况下,您可以简单地使用其Express 4版本替换旧版本3中间件。有关详细信息,请参阅GitHub中的模块文档。

app.use accepts parameters

在版本4中,您可以使用可变参数来定义加载中间件功能的路径,然后从路由处理程序读取参数的值。例如:

app.use('/book/:id', function (req, res, next) { console.log('ID:', req.params.id) next() })

路由系统

应用程序现在隐式加载路由中间件,因此您不必担心中间件与中间件相关的加载顺序router

您定义路线的方式不变,但路线系统有两个新功能可帮助组织您的路线:

  • 一种新方法,app.route()为路径路径创建可链接的路由处理程序。

  • 一个新的类,express.Router创建模块化可挂载路由处理程序。

app.route() method

app.route()方法使您能够为路径路径创建可链接的路由处理程序。由于路径是在单个位置指定的,因此创建模块化路线很有帮助,因为这可以减少冗余和拼写错误。有关路线的更多信息,请参阅Router()文档。

以下是使用app.route()函数定义的链接路由处理程序的示例。

app.route('/book') .get(function (req, res) { res.send('Get a random book') }) .post(function (req, res) { res.send('Add a book') }) .put(function (req, res) { res.send('Update the book') })

express.Router class

另一个有助于组织路由的功能是一个新类,express.Router您可以使用它创建模块化可挂载的路由处理程序。一个Router实例是一个完整的中间件和路由系统; 由于这个原因,它通常被称为“迷你应用程序”。

以下示例将路由器创建为模块,加载中间件,定义一些路由,并将其安装在主应用的路径上。

例如,创建一个名为birds.jsapp目录中的路由器文件,其中包含以下内容:

var express = require('express') var router = express.Router() // middleware specific to this router router.use(function timeLog (req, res, next) { console.log('Time: ', Date.now()) next() }) // define the home page route router.get('/', function (req, res) { res.send('Birds home page') }) // define the about route router.get('/about', function (req, res) { res.send('About birds') }) module.exports = router

然后,在应用程序中加载路由器模块:

var birds = require('./birds') // ... app.use('/birds', birds)

该应用程序现在将能够处理请求的/birds/birds/about路径,并调用特定的路线的timeLog中间件。

其他变化

下表列出了Express 4中的其他小而重要的更改:

对象描述
Node.js Express 4需要Node.js 0.10.x或更高版本,并且已经放弃了对Node.js 0.8.x的支持。
http.createServer() 不再需要http模块,除非您需要直接使用(socket.io/SPDY/HTTPS)。该应用程序可以通过使用app.listen()函数启动。
app.configure() app.configure()函数已被删除。使用process.env.NODE_ENV或app.get('env')函数检测环境并相应地配置应用程序。
json spaces Express 4中默认禁用json spaces应用程序属性。
req.accepted() 使用req.accepts(),req.acceptsEncodings(),req.acceptsCharsets()和req.acceptsLanguages()。
res.location() 不再解析相对URL。
req.params 过去是数组; 现在是对象。
res.locals过去是功能; 现在是对象。
res.headerSent 已更改为res.headersSent。
app.route 现在可用作app.mountpath。
res.on('header')已删除。
res.charset已删除。
res.setHeader('Set-Cookie', val) 现在功能限于设置基本的cookie值。使用res.cookie()来增加功能。

应用迁移示例

以下是将Express 3应用程序迁移到Express 4的示例。感兴趣的文件有app.jspackage.json

版本3的应用程序

app.js

考虑使用以下app.js文件的Express v.3应用程序:

var express = require('express') var routes = require('./routes') var user = require('./routes/user') var http = require('http') var path = require('path') var app = express() // all environments app.set('port', process.env.PORT || 3000) app.set('views', path.join(__dirname, 'views')) app.set('view engine', 'pug') app.use(express.favicon()) app.use(express.logger('dev')) app.use(express.methodOverride()) app.use(express.session{ secret: 'your secret here' })) app.use(express.bodyParser()) app.use(app.router) app.use(express.static(path.join(__dirname, 'public'))) // development only if (app.get('env') === 'development') { app.use(express.errorHandler()) } app.get('/', routes.index) app.get('/users', user.list) http.createServer(app).listen(app.get('port'), function () { console.log('Express server listening on port ' + app.get('port')) })

package.json

附加的版本3 package.json文件可能如下所示:

{ "name": "application-name", "version": "0.0.1", "private": true, "scripts": { "start": "node app.js" }, "dependencies": { "express": "3.12.0", "pug": "*" } }

处理

通过安装Express 4应用程序所需的中间件并使用以下命令将Express和Pug更新为各自的最新版本,开始迁移过程:

$ npm install serve-favicon morgan method-override express-session body-parser multer errorhandler express@latest pug@latest --save

对以下内容更改至app.js

  • 内置的快速中间件功能express.faviconexpress.loggerexpress.methodOverrideexpress.sessionexpress.bodyParserexpress.errorHandler不再是可用的express对象。您必须手动安装替代品并将其加载到应用程序中。

2. 您不再需要加载app.router功能。它不是有效的Express 4应用程序对象,因此删除app.use(app.router代码

3. 确保中间件功能以正确的顺序加载 - 加载errorHandler应用程序路径后加载。

  • 删除了--sessions选项。

2. 删除了--jshtml选项。

3. 增加了--hogan支持Hogan.js的选项。

示例

执行以下命令来创建Express 4应用程序:

$ express app4

如果您查看app4/app.js文件的内容,您会注意到express.static应用程序所需的所有中间件功能(除外)都作为独立模块加载,并且router中间件不再显式加载到应用程序中。

您还会注意到,app.js文件现在是一个Node.js模块,与旧生成器生成的独立应用程序相反。

安装依赖关系后,使用以下命令启动应用程序:

$ npm start

如果您查看文件中的npm start脚本package.json,您会注意到启动应用程序的实际命令是node ./bin/www,而不是以前在Express 3中的node app.js命令。

由于Express 4生成器生成的文件app.js现在是Node.js模块,因此不能再作为应用程序独立启动(除非您修改代码)。该模块必须加载到Node.js文件中并通过Node.js文件启动。Node.js文件就是./bin/www这种情况。

无论是创建快速应用程序还是启动应用程序,bin目录和扩展名www文件都不是必需的。他们只是建议,所以随时修改它们以满足您的需求。

要删除www目录并保留“Express 3 way”,请删除文件module.exports = app;末尾的行app.js,然后将以下代码粘贴到它的位置:

app.set('port', process.env.PORT || 3000) var server = app.listen(app.get('port'), function () { debug('Express server listening on port ' + server.address().port) })

确保使用以下代码debugapp.js文件顶部加载模块:

var debug = require('debug')('app4')

接下来,将package.json文件中的"start": "node ./bin/www"更改为"start": "node app.js"

您现在已将./bin/www功能移回app.js。此更改并不推荐,但练习可帮助您了解./bin/www文件的工作方式以及app.js文件不再自行启动的原因。