©
本文档使用 PHP中文网手册 发布
Express 4区别于Express 3有重大改变。这意味着如果您依赖于更新Express版本,现有的Express 3应用程序将无法工作。
本文涵盖:
Express 4中的更改
将Express 3应用程序迁移到Express 4的示例。
升级到Express 4应用程序生成器。
Express 4有几个重大变化:
Express核心和中间件系统的变化。Connect和内置中间件的依赖关系已被删除,因此您必须自己添加中间件。
路由系统的变化。
各种其他变化。
也可以看看:
4.x中的新功能
从3.x迁移到4.x.
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
。
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 environmentsapp.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 onlyif (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
应用程序路径后加载。
package.json
运行上述npm
命令将更新package.json
如下:
{ "name": "application-name", "version": "0.0.1", "private": true, "scripts": { "start": "node app.js" }, "dependencies": { "body-parser": "^1.5.2", "errorhandler": "^1.1.1", "express": "^4.8.0", "express-session": "^1.7.2", "pug": "^2.0.0", "method-override": "^2.1.2", "morgan": "^1.2.2", "multer": "^0.1.3", "serve-favicon": "^2.0.1" }}
app.js
然后,删除无效代码,加载所需的中间件,并根据需要进行其他更改。该app.js
文件将如下所示:
var http = require('http') var express = require('express') var routes = require('./routes') var user = require('./routes/user') var path = require('path') var favicon = require('serve-favicon') var logger = require('morgan') var methodOverride = require('method-override') var session = require('express-session') var bodyParser = require('body-parser') var multer = require('multer') var errorHandler = require('errorhandler') 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(favicon(path.join(__dirname, '/public/favicon.ico'))) app.use(logger('dev')) app.use(methodOverride()) app.use(session({ resave: true, saveUninitialized: true, secret: 'uwotm8' })) app.use(bodyParser.json()) app.use(bodyParser.urlencoded({ extended: true })) app.use(multer()) app.use(express.static(path.join(__dirname, 'public'))) app.get('/', routes.index)app.get('/users', user.list) // error handling middleware should be loaded after the loading the routes if (app.get('env') === 'development') { app.use(errorHandler())} var server = http.createServer(app)server.listen(app.get('port'), function () { console.log('Express server listening on port ' + app.get('port'))})
除非您需要直接使用http
模块(socket.io/SPDY/HTTPS),否则不需要加载它,并且可以通过以下方式简单地启动应用程序:
app.listen(app.get('port'), function () { console.log('Express server listening on port ' + app.get('port'))})
迁移过程已完成,该应用现在是Express 4应用。要确认,请使用以下命令启动应用程序:
$ node .
加载http:// localhost:3000 并查看由Express 4渲染的主页。
用于生成Express应用程序的命令行工具仍然存在 express
,但要升级到新版本,您必须卸载Express 3应用程序生成器,然后安装新的 express-generator
。
如果您的系统中已安装Express 3应用程序生成器,则必须将其卸载:
$ npm uninstall -g express
根据文件和目录权限的配置方式,可能需要使用此命令运行sudo
。
现在安装新的发生器:
$ npm install -g express-generator
根据文件和目录权限的配置方式,可能需要使用此命令运行sudo
。
现在express
系统上的命令被更新为Express 4生成器。
命令选项和用法在很大程度上保持不变,但有以下例外:
删除了--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
文件不再自行启动的原因。