Express应用程序中的中间件的使用教程

114 阅读4分钟

如果你最近搬到或正在考虑搬到nodejs Express框架,那么你应该首先熟悉它的路由和中间件的概念,因为Express应用程序本质上是一系列的中间件函数调用。Express中的中间件是在客户端发出请求后执行的函数,中间件根据其目的处理请求,然后将请求移交给链中的下一个中间件,如果是链中的最后一个,则产生一个输出,终止请求-响应循环。

中间件的简述

中间件是主要与Express应用程序中的两个主要对象--请求对象(req )和响应对象(res )一起工作的函数。它还可以访问'next'函数,这是应用程序的请求-响应循环中的下一个函数。下一个函数是Express路由器中的一个函数,当它被调用时,将执行接替当前中间件的中间件。

中间件函数主要执行以下任务。

a.执行代码。
b.对请求和/或响应对象进行更改。
c.结束请求-响应循环,或
d.使用next() ,调用堆栈中的下一个中间件。

如果当前的中间件函数没有结束请求-响应周期,它必须调用next() ,将控制权传递给下一个中间件函数。否则,该请求将被挂起,没有任何进一步的行动。

一个例子

以下面这个基本的Express应用程序为例,它的任务是在浏览器中打印 "Hello World!"。

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

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

app.listen(3000);

现在我们要做的是把所有的尿液和它们的访问时间记录到控制台。我们可以创建一个中间件,而不是将代码添加到 "get "路由中,这样我们就可以做到这一点,而不需要对现有代码进行修改。

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

/* url logger middleware */
var urlLogger = function (req, res, next) {
  console.log(Date(Date.now()) + " : " + req.url);
  next();
}

app.use(urlLogger);

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

app.listen(3000);

现在,每次我们请求网络应用的时候,请求的URL都会被记录在控制台中,同时还有时间,如下图所示。

Tue Jan 15 2019 14:05:34 GMT+0530 (GMT+05:30) : /welcome

中间件的注意点

注意上述urlLogger 中间件结尾处的next() 函数调用。这基本上是将请求移交给链中的下一个中间件。如果不小心省略了这一点,那么应用程序将没有任何东西可以进一步移交给请求,并将继续等待。在我们上面的例子中,urlLogger 中间件将把请求移交给下一个队列--"get "路由。正如你所看到的,"get "路由没有调用next() ,这基本上意味着它是该链中的最后一个中间件。

注意:中间件的加载顺序很重要--先加载的中间件功能也会先被执行。如果在我们的例子中,urlLogger 是在根路径的路由之后加载的,那么请求永远不会到达 "get "路由,应用程序也不会打印url的详细信息,因为根路径的路由处理程序会终止请求-响应循环。

如果我们稍后定义中间件,那么中间件将不会在请求中被执行。

/* url logger middleware will not be executed on the following 'get' request
   as it is defined later.
 */
app.get('/', function (req, res) {
  res.send('Hello World!');
})

app.use(urlLogger);

由于我们在全局应用的基础上定义了urlLogger ,这个中间件将在所有应用的请求或路由上执行。你可以通过删除以下在全局基础上定义的一行,在选定的路由上使用urlLogger中间件。

app.use(urlLogger);

并根据需要在路由中指定该中间件。让我们说,我们只需要记录对"/welcome "路由的请求。下面的内容将实现同样的目的。

app.get('/welcome', urlLogger, function (req, res) {
  res.send('Welcome!');
})

请注意,我们可以给'next'函数起任何名字,但要在你的应用程序中保持一致。我更喜欢 "next",因为这是官方惯例。下面我们将其命名为'done'。

var urlLogger = function (req, res, done) {
  console.log(Date(Date.now()) + " : " + req.url);
  done();
}

综上所述

有许多第三方的中间件可以帮助你建立你的Express应用程序。一个常用的是'body-parser'--一个在你的处理程序之前解析传入请求体的中间件,它可以在'req.body'属性下使用。

在下一篇文章中,我们将看到更多关于如何为各种路由定义Express中间件。