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