菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
91
0

Express 官网文档翻译-3.2-开发中间件

原创
05/13 14:22
阅读数 411

为 Express 应用开发中间件

概述

中间件 函数本质上是一些可以在应用的请求-响应周期内,访问 请求对象 (req),响应对象 (res),和 next 方法的函数。next 方法是 Express 路由中的一个方法,当被调用时,它将在当前中间件的基础上执行下一个中间件。

中间件函数可以执行下面这些任务:

  • 执行一些逻辑代码。
  • 改变请求和响应对象。
  • 结束请求-响应周期。
  • 在执行栈中调用下一个中间件。

如果当前的中间件函数没有结束掉请求-响应周期,它必须调用 next() 把控制权传递给下一个中间件函数。否则,请求将会被一直处于挂起状态。

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

Node.js

中间件函数对应的 HTTP 方法。

中间件函数对应的 (路由)路径。

中间件函数

中间件函数的回调参数,通常称为「next」

中间件的参数 HTTP 响应,通常称为 「res」。

中间件的参数 HTTP 请求 ,通常称为「req」。

\

例子

下面是一个简单的 Express 应用「Hello World」。接下来的文章中将会定义两个中间件函数:一个叫做 myLogger ,用于打印一些日志的简单信息;另一个叫做requestTime,用于显示 HTTP 请求的时间戳。

var express = require('express')
var app = express()

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

app.listen(3000)

中间件函数 myLogger

这里定义一个简单的中间件函数「myLogger」。当一个请求通过这个中间件函数时,会输出「LOGGED」。这个中间件函数声明为 myLogger

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

注意上面对注意上面对  next() 的调用。调用此函数将执行应用程序中的下一个中间件函数。 next()函数不是 Node.js 或 Express API 的一部分,而是传递给中间件函数的第三个参数。 next() 函数可以被命名为其他名字,但按照惯例,它总是被命名为 next()。为避免混淆,请始终使用此约定。

加载一个中间件函数,可以使用 app.use(),并指定中间件函数名。例如,下面的代码在路由到根路径 (/) 之前加载了 myLogger 中间件函数。

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

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

应用程序现在可以使用  requestTime 中间件函数了。当然,根路由的回调函数也可以使用 requestTime 中间件添加到 req (请求对象)的同名属性。

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 中间件

可配置的中间件

如果你需要你的中间件是可配置的,可以导出一个函数,这个函数接受一个配置项对象或者其他参数的,然后,根据输入参数返回一个中间件实例。

文件: my-middleware.js

module.exports = function(options) {
  return function(req, res, next) {
    // 基于输入参数的中间件实例
    next()
  }
}

现在可以像下面这样使用这个中间件了。

var mw = require('./my-middleware.js')

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

有关可配置中间件的示例,请查看cookie-session和compression 这两个中间件。

发表评论

0/200
91 点赞
0 评论
收藏
为你推荐 换一批