在理解之前next
,您需要稍微了解一下节点中的请求-响应周期。它从您对特定资源发出HTTP请求开始,并在您将响应发送回用户时结束,即遇到诸如res.send('Hello World')之类的内容时结束。
让我们看一个非常简单的例子。
app.get('/hello', function (req, res, next) {
res.send('USER')
})
这里我们不需要next(),因为resp.send将结束循环并将控制权交还给路由中间件。
现在让我们看另一个例子。
app.get('/hello', function (req, res, next) {
res.send("Hello World !!!!");
});
app.get('/hello', function (req, res, next) {
res.send("Hello Planet !!!!");
});
在这里,我们有2个中间件功能用于同一路径。但是您总是会得到第一个响应。因为首先安装在中间件堆栈中,然后res.send将结束循环。
但是,如果我们始终不希望出现“ Hello World !!!!”,该怎么办?回应回来。在某些情况下,我们可能需要“ Hello Planet !!!!” 响应。让我们修改上面的代码,看看会发生什么。
app.get('/hello', function (req, res, next) {
if(some condition){
next();
return;
}
res.send("Hello World !!!!");
});
app.get('/hello', function (req, res, next) {
res.send("Hello Planet !!!!");
});
这是在next
做什么 是的,你可能有脾气。如果条件为真,它将跳过第一个中间件函数,并调用下一个中间件函数,您将获得"Hello Planet !!!!"
响应。
因此,接下来将控件传递给中间件堆栈中的下一个功能。
如果第一个中间件功能没有发回任何响应但执行了一段逻辑,然后又从第二个中间件功能得到了响应,该怎么办呢?
如下所示:
app.get('/hello', function (req, res, next) {
// Your piece of logic
next();
});
app.get('/hello', function (req, res, next) {
res.send("Hello !!!!");
});
在这种情况下,您需要调用两个中间件功能。因此,达到第二个中间件功能的唯一方法是调用next();。
如果您不拨打电话,该怎么办。不要期望第二个中间件功能会自动被调用。调用第一个功能后,您的请求将被挂起。第二个函数将永远不会被调用,您也不会取回响应。
res.send
完成请求。如果不存在,则可能有另一个处理程序将发出错误并完成请求。