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 3 | Express 4 |
---|---|
express.bodyParser | body-parser + multer |
express.compress | compression |
express.cookieSession | cookie-session |
express.cookieParser | cookie-parser |
express.logger | morgan |
express.session | express-session |
express.favicon | serve-favicon |
express.responseTime | response-time |
express.errorHandler | errorhandler |
express.methodOverride | method-override |
express.timeout | connect-timeout |
express.vhost | vhost |
express.csrf | csurf |
express.directory | serve-index |
express.static | serve-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.js
app目录中的路由器文件,其中包含以下内容:
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.js
和package.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.favicon
,express.logger
,express.methodOverride
,express.session
,express.bodyParser
和express.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)
})
确保使用以下代码debug
在app.js
文件顶部加载模块:
var debug = require('debug')('app4')
接下来,将package.json
文件中的"start": "node ./bin/www"
更改为"start": "node app.js"
。
您现在已将./bin/www
功能移回app.js
。此更改并不推荐,但练习可帮助您了解./bin/www
文件的工作方式以及app.js
文件不再自行启动的原因。