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

2.编写用于Express应用程序的中间件 | 2. Writing middleware for use in Express apps

概述

中间件功能是可以访问请求对象(req),响应对象(res)以及next应用程序请求 - 响应周期中的函数。该next功能是Express路由器中的一项功能,当被调用时,该功能执行当前中间件之后的中间件。

中间件功能可以执行以下任务:

  • 执行任何代码。
  • 对请求和响应对象进行更改。
  • 结束请求 - 响应循环。
  • 调用堆栈中的下一个中间件。

如果当前的中间件功能没有结束请求 - 响应周期,则它必须调用next()以将控制传递给下一个中间件功能。否则,请求将被挂起。

下图显示了中间件函数调用的元素:

适用中间件功能的HTTP方法。中间件功能适用的路径(路由)。中间件功能。中间件功能的回调参数,按照惯例称为“下一个”。对中间件功能的HTTP响应参数,按照惯例称为“res”。中间件功能的HTTP请求参数,按惯例称为“req”。

这是一个简单的“Hello World”表达应用程序的例子。本文的其余部分将定义并向应用程序添加两个中间件功能:一个调用myLogger打印简单的日志消息,另一个调用requestTime显示HTTP请求的时间戳。

代码语言:javascript
复制
var express = require('express')
var app = express()

app.get('/', function (req, res) {
  res.send('Hello World!')
})

app.listen(3000)

中间件功能myLogger

这是一个称为“myLogger”的中间件功能的简单示例。这个函数只是在对应用程序的请求通过时打印“LOGGED”。中间件功能被分配给一个名为的变量myLogger

代码语言:javascript
复制
var myLogger = function (req, res, next) {
  console.log('LOGGED')
  next()
}

注意上面的呼叫next()。调用这个函数会调用应用程序中的下一个中间件功能。该next()函数不是Node.js或Express API的一部分,而是传递给中间件功能的第三个参数。该next()函数可以被命名为任何东西,但按照惯例,它总是被命名为“下一个”。为避免混淆,请始终使用此约定。

要加载中间件功能,请调用app.use(),指定中间件功能。例如,以下代码会在myLogger到根路径(/)的路由之前加载中间件功能。

代码语言:javascript
复制
var express = require('express')
var app = express()

var myLogger = function (req, res, next) {
  console.log('LOGGED')
  next()
}

app.use(myLogger)

app.get('/', function (req, res) {
  res.send('Hello World!')
})

app.listen(3000)

每次应用收到请求时,它都会向终端输出“LOGGED”消息。

中间件加载顺序非常重要:首先加载的中间件功能也首先执行。

如果myLogger在到根路径的路由之后加载,请求将永远达不到它,并且应用程序不会打印“LOGGED”,因为根路径的路由处理程序会终止请求 - 响应循环。

中间件功能myLogger仅打印消息,然后通过调用该next()函数将请求传递到堆栈中的下一个中间件功能。

中间件功能requestTime

接下来,我们将创建一个名为“requestTime”的中间件函数,并将其添加为调用requestTime请求对象的属性。

代码语言:javascript
复制
var requestTime = function (req, res, next) {
  req.requestTime = Date.now()
  next()
}

应用程序现在使用requestTime中间件功能。此外,根路径路由的回调函数使用中间件功能添加到的属性req(请求对象)。

代码语言:javascript
复制
var express = require('express')
var app = express()

var requestTime = function (req, res, next) {
  req.requestTime = Date.now()
  next()
}

app.use(requestTime)

app.get('/', function (req, res) {
  var responseText = 'Hello World!<br>'
  responseText += '<small>Requested at: ' + req.requestTime + '</small>'
  res.send(responseText)
})

app.listen(3000)

当您向应用程序的根目录发出请求时,应用程序现在会在浏览器中显示请求的时间戳。

因为您可以访问请求对象,响应对象,堆栈中的下一个中间件功能以及整个Node.js API,所以使用中间件功能的可能性是无限的。

有关Express中间件的更多信息,请参阅:使用Express中间件。

可配置的中间件

如果您需要中间件可配置,则导出一个接受选项对象或其他参数的函数,然后根据输入参数返回中间件实现。

File: my-middleware.js

代码语言:javascript
复制
module.exports = function(options) {
  return function(req, res, next) {
    // Implement the middleware function based on the options object
    next()
  }
}

现在可以使用中间件,如下所示。

代码语言:javascript
复制
var mw = require('./my-middleware.js')

app.use(mw({ option1: '1', option2: '2' }))

扫码关注腾讯云开发者

领取腾讯云代金券