没有next参数的Node.js Express中间件函数

3
在Express中间件中,应该有三个参数:请求、响应和下一个处理程序(request, response, next)。然而,在我从一本书中复制的代码中的第二个中间件中,只使用了请求和响应(request, response)。这是什么原因?next是否是可选的?
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);
2个回答

21
当你想要为请求继续到达下一个中间件或处理此请求的下一个路由处理程序时,调用next()。通常有多个中间件可能会检查给定的请求,因此如果您没有发送响应并且希望正常路由继续进行此请求,则在完成处理并希望路由继续时调用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");
    }
});

Express并不在意你是否声明了next参数。如果你打算使用它,那么就声明它。如果你不打算使用它,那么没有理由去声明它,但是它仍然会被传递。这对于所有的Javascript函数参数都是正确的。如果你没有将所有的参数声明为命名参数,则访问它们会更加困难,但它们仍然存在(为了完整性,可以通过arguments对象访问它们)。
还有一种特殊情况的路由处理程序,它有四个参数(err, req, res, next),用于错误处理(当调用next(err)时),但这不是你问题的所在。Express确实会把声明了四个参数的路由处理程序视为错误处理程序进行注册。

8

使用 express.js 有4种基本处理方式。

  • 2 - req,res
  • 3 - req,res,next
  • 4 - err,req,res,next

如果你只有2个参数,无论你怎么定义它们,express都会将它们分配给req和res。这是一种通用的调用约定,在express社区广泛使用,可以使代码更加清晰、可读且易懂。


2
请注意:错误处理中间件始终需要四个参数。您必须提供四个参数才能将其标识为错误处理中间件函数。即使您不需要使用next对象,您也必须指定它以维护签名。否则,next对象将被解释为常规中间件,并且无法处理错误。 - ryk0v

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接