【问题标题】:Node.js Express middleware function without nextNode.js Express 中间件功能没有 next
【发布时间】:2017-02-23 21:45:21
【问题描述】:

在 Express 中间件中,它应该采用 3 个参数:request、response、next。 但是,在我从书中复制的代码中的第二个中间件中,却只使用了 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);

【问题讨论】:

    标签: node.js express middleware


    【解决方案1】:

    next() 当您希望此请求的路由继续到此请求的下一个中间件或下一个路由处理程序时调用。通常有多个中间件可能会检查给定请求,因此如果您没有发送响应并希望正常路由继续处理该请求,那么当您完成处理并且想要路由继续。

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

    是否声明参数next 由您决定。如果您从不打算调用它,则无需将其声明为参数(它仍然是传递的,但如果您不打算使用它,则不必声明它)。

    因此,您可以使用参数 reqres 声明您的中间件/请求集处理程序,如下所示:

    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 确实对待具有不同声明的四个参数的路由处理程序。它将它们注册为错误处理程序。

    【讨论】:

      【解决方案2】:

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

      • 2 - 请求,请求
      • 3 - 请求、请求、下一个
      • 4 - 错误、请求、请求、下一个

      如果您有 2 个参数,无论您如何称呼它们,express 都会为它们分配一个 req 和 res。它只是一种被 express 社区广泛使用的调用约定,可以使代码更清晰、可读和易于理解。

      【讨论】:

      • 注意,错误处理中间件总是需要四个参数。您必须提供四个参数以将其标识为错误处理中间件函数。即使您不需要使用下一个对象,您也必须指定它来维护签名。否则,下一个对象将被解释为常规中间件,无法处理错误。
      猜你喜欢
      • 1970-01-01
      • 2018-09-27
      • 1970-01-01
      • 1970-01-01
      • 2018-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-03
      相关资源
      最近更新 更多