首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

8.转到Express 4 | 8. Moving to 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版本和发行版不受中间件更新的影响。

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

  1. 安装模块: 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中,您可以使用可变参数来定义加载中间件功能的路径,然后从路由处理程序读取参数的值。例如:

代码语言:javascript
复制
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()函数定义的链接路由处理程序的示例。

代码语言:javascript
复制
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目录中的路由器文件,其中包含以下内容:

代码语言:javascript
复制
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

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

代码语言:javascript
复制
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应用程序:

代码语言:javascript
复制
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文件可能如下所示:

代码语言:javascript
复制
{
  "name": "application-name",
  "version": "0.0.1",
  "private": true,
  "scripts": {
    "start": "node app.js"
  },
  "dependencies": {
    "express": "3.12.0",
    "pug": "*"
  }
}

处理

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

代码语言:javascript
复制
$ npm install serve-favicon morgan method-override express-session body-parser multer errorhandler express@latest pug@latest --save

对以下内容更改至app.js

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

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

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

版本4应用程序

package.json

运行上述npm命令将更新package.json如下:

代码语言:javascript
复制
{
  "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文件将如下所示:

代码语言:javascript
复制
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),否则不需要加载它,并且可以通过以下方式简单地启动应用程序:

代码语言:javascript
复制
app.listen(app.get('port'), function () {
  console.log('Express server listening on port ' + app.get('port'))
})

运行应用程序

迁移过程已完成,该应用现在是Express 4应用。要确认,请使用以下命令启动应用程序:

代码语言:javascript
复制
$ node .

加载http:// localhost:3000 并查看由Express 4渲染的主页。

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

用于生成Express应用程序的命令行工具仍然存在 express,但要升级到新版本,您必须卸载Express 3应用程序生成器,然后安装新的 express-generator

安装

如果您的系统中已安装Express 3应用程序生成器,则必须将其卸载:

代码语言:javascript
复制
$ npm uninstall -g express

根据文件和目录权限的配置方式,可能需要使用此命令运行sudo

现在安装新的发生器:

代码语言:javascript
复制
$ npm install -g express-generator

根据文件和目录权限的配置方式,可能需要使用此命令运行sudo

现在express系统上的命令被更新为Express 4生成器。

对应用程序生成器的更改

命令选项和用法在很大程度上保持不变,但有以下例外:

  1. 删除了--sessions选项。

2. 删除了--jshtml选项。

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

示例

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

代码语言:javascript
复制
$ express app4

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

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

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

代码语言:javascript
复制
$ 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,然后将以下代码粘贴到它的位置:

代码语言:javascript
复制
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文件顶部加载模块:

代码语言:javascript
复制
var debug = require('debug')('app4')

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

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

扫码关注腾讯云开发者

领取腾讯云代金券