Node.js 没有next的Express中间件功能

Node.js Express middleware function without next

在 Express 中间件中,它应该有 3 个参数:request、response、next。 但是,在我从书上复制的代码中的第2个中间件中,却只使用了request,response。这是什么原因?下一个是可选的吗?

var express = require("express");
var http = require("http");

var app = express();

app.use(function(request, response, next) {
    console.log("In comes a " + request.method + " to " + request.url);
    next();
});

app.use(function(request, response) {
    response.writeHead(200, { "Content-Type": "text/plain" });
    response.end("Hello, world!");
});

http.createServer(app).listen(3000);
当您希望此请求的路由继续到下一个中​​间件或此请求的下一个路由处理程序时,将调用

next()。通常有多个中间件可能会检查给定请求,因此如果您没有发送响应并希望继续正常路由此请求,那么您将在完成处理后调用 next() 并且您希望路由继续。

如果您已经发送了一个响应,因此不希望路由继续,那么您就不要调用 next()

是否声明参数next由您决定。如果你从来没有打算调用它,那么你不需要将它声明为参数(它仍然是传递的,但如果你不打算使用它就不必声明它)。

因此,您可以使用参数 reqres 声明 middleware/requeset 处理程序,如下所示:

app.use("/someRoute", function(req, res) {
    res.send("hello");
});

或者,使用参数 reqresnext,如下所示:

app.use("/someRoute", function(req, res, next) {
    if (req.query.x) {
        // don't handle this request here, let some other route
        // handler following this handle it
        next();
    } else {
        // send the response, no more route handlers after this
        res.send("hello");
    }
});

是否声明 next 参数对 Express 没有影响。如果您打算使用它,请声明它。如果您不打算使用它,则没有理由声明它,但无论如何它都会通过。所有 Javascript 函数参数都是如此。如果您不将所有参数都声明为命名参数,这只会使访问它们变得更加困难,但它们仍然存在(为了完整起见,仍然可以通过 arguments 对象访问)。

还有一个带有四个参数 (err, req, res, next) 的特殊情况路由处理程序,用于错误处理(当调用 next(err) 时),但这不是您的问题。 Express 确实使用四个声明不同的参数来处理路由处理程序。它将它们注册为错误处理程序。

express.js 有 4 种基本处理程序。

  • 2 - 请求,资源
  • 3 - 请求、结果、下一个
  • 4 - 错误、请求、结果、下一个

如果你有 2 个参数,express 总是会为它们分配一个 req 和 res,不管你怎么称呼它们。它只是一个被 express 社区广泛使用的调用约定,它使代码更清晰、可读和可理解。