NodeJS 中的 next() 函数

Isaac Tony 2023年1月30日
  1. 在 ExpressJS 中使用 next() 函数编写自定义 Middleware 函数
  2. 使用 next() 函数将控制权传递给 ExpressJS 中的下一个 Middleware 函数
  3. 使用 next(err) 函数使用 ExpressJS 处理路由中的错误
NodeJS 中的 next() 函数

next() 函数不是 Node js 核心的一部分,但在 Express js 中被广泛用作中间件函数。

在 ExpressJS 中使用 next() 函数编写自定义 Middleware 函数

next() 在 Express js 中编写自定义中间件函数时很有用,它允许我们将控制权从一个中间件函数传递给另一个。

Express js 是一个极简框架,为开发 Web 和移动应用程序提供了强大的功能。

Express js 大量使用中间件功能,通常被称为路由和中间件框架。

另一方面,中间件函数可以访问响应和请求周期,并且本质上用于修改响应和请求对象。

中间件函数也可以用来执行一些代码,调用下一个中间件或者在没有下一个中间件的情况下结束请求和响应循环。

一个简单的 Express 应用程序通常涉及多个中间件功能。我们可以在快速应用程序中拥有五种类型的中间件功能,它们是:

  • 应用级中间件
  • 路由级中间件
  • 错误处理中间件
  • 内置中间件
  • 第三方中间件

我们将创建两个 middleware 函数并学习如何使用 next() 函数进行传递。我们还将使用 app.use() 函数来挂载中间件函数。

如果 middleware 函数附加到特定路径,则仅当对该特定路径发出请求时才会调用它。该函数接受以下参数:

  • middleware 函数正在安装的路径。
  • call-back 函数包含请求和响应对象以及将控制权传递给下一个 middleware 函数的下一个参数。
  • 我们将首先在我们的函数中安装 express js,并使用下面的命令在我们的项目文件中要求它。
npm install express
const express = require('express');
 
const app = express();
const port = 8080;
 
app.use((req, res, next) => {
    console.log("First middleware function !");
    return next();
  });
 
app.use("/tonyloi", (req, res, next) => {
    console.log("Second middleware function!");
    return next();
  });
 
app.listen(8080, () =>{
    console.log(`The server is running on port: ${port}` );
});

输出:

The server is running on port: 8080
First middleware function !
First middleware function !
Second middleware function!

在上面的例子中,第一个 middleware 函数针对我们在上面创建的简单 Express 服务器发出的每个请求执行。

使用 next() 函数,它将控制权传递给下一个中间件,当通过 URL http://localhost:8080/tonyloi 发出请求时,第二个中间件也将被执行。

请注意,由于第一个中间件未绑定到任何路径,因此向服务器发出的任何请求都会触发其执行。

另一方面,未能在第一个中间件中使用 next() 函数会使该中间件函数挂起,因此不会将控制权传递给下一个中间件函数。

这在下面的示例中得到了演示,我们特意将两个中间件函数绑定到同一路径。

无论如何,第一个中间件函数仍然可以将控制权传递给下一个中间件函数,如下所示。

const express = require('express');

const app = express();
const port = 8080;

app.use("/tonyloi", (req, res, next) => {
    console.log("First middleware function !");

  });

app.use("/tonyloi", (req, res, next) => {
    console.log("Second middleware function!");

  });

app.listen(8080, () =>{
    console.log(`The server is running on port: ${port}` );
});

输出:

The server is running on port: 8080
First middleware function !

使用 next() 函数将控制权传递给 ExpressJS 中的下一个 Middleware 函数

如下所示,当包含 next() 函数时,我们可以将控制权传递给下一个中间件。

const express = require('express');

const app = express();
const port = 8080;

app.use("/tonyloi", (req, res, next) => {
    console.log("First middleware function !");
    //pass control to the next middleware
    return next();

  });

app.use("/tonyloi", (req, res, next) => {
    console.log("Second middleware function!");

  });

app.listen(8080, () =>{
    console.log(`The server is running on port: ${port}` );
});

输出:

The server is running on port: 8080
First middleware function !
Second middleware function!

Middleware 函数也是 Express js 中错误处理的重要组成部分。但是,Express 有一个默认的错误处理程序,用于处理路由处理程序和中间件中的错误。

我们仍然需要处理异步发生的错误。这就是 next() 函数真正有用的地方。

next() 函数指示 Express 在不带参数使用时转到下一个中​​间件函数。

使用 next(err) 函数使用 ExpressJS 处理路由中的错误

但是,当与诸如 next(err) 函数之类的参数一起使用时,会触发负责处理该特定路由错误的中间件函数。

const express = require('express');
const app = express();
const port = 8080;

app.get('/users', function(req, res){

   var err = new Error("Assume something went wrong in your code !");
   next(err);
});

app.use(function(err, req, res, next) {
   res.status(500);
   res.send("Something is wrong in your code !");
});

app.listen(8080, () =>{
    console.log(`The server is running on port: ${port}` );
});

输出:

Something is wrong in your code !

因此,next(err) 函数也可以处理错误,如上所示。此函数跳过所有其他内联中间件,而是在检测到错误时执行错误处理中间件。

我们还应该注意,错误处理中间件应该始终包含四个参数,就像我们在上面所做的那样。

此外,我们还应该指定下一个对象未​​能执行此中间件将被视为常规中间件,并且不会处理错误。

最后,我们还可以使用 next('route') 函数跳过当前路由上的后续中间件函数。这个函数就像一个退出函数,我们可以用它来跳转到下一个匹配的路由。

作者: Isaac Tony
Isaac Tony avatar Isaac Tony avatar

Isaac Tony is a professional software developer and technical writer fascinated by Tech and productivity. He helps large technical organizations communicate their message clearly through writing.

LinkedIn