在这个问题上有一些帖子,但没有一个直接回答问题,正面。让我澄清一下,我理解(或者我认为)使用next(),next('route'),return next(),return以及它们对控制流的影响。 我的应用程序的整个中间件包含一系列app.use,如:
Enter a number
1
2
3
4
67305985
262914
1027
4
在每个中间件中,我都可以发送响应,无需进一步处理即可完成。我的问题是我无法阻止处理进入下一个中间件。
我的工作笨拙。我只是在发送响应后设置了res.locals.completed标志。在所有中间件中,一开始,我检查此标志并跳过中间件中的处理(如果设置了标志)。在第一个中间件中,此标志未设置。
当然,必须有更好的解决方案,它是什么?我认为Express会隐式地通过一些特定于特定的方法来检查并跳过中间件吗?
答案 0 :(得分:7)
根据http://expressjs.com/guide/using-middleware.html
上的明确文件next()
因此,如果中间件需要尽早结束请求 - 响应,则只需不要调用res.end
,但请确保中间件通过调用res.send
,res.render
来确实结束请求响应,res.end
或任何隐含地调用app.use(function (req, res, next) {
if (/* stop here */) {
res.end();
} else {
next();
}
});
var express = require('express');
var app = express();
var count = 0;
app.use(function(req, res, next) {
console.log('f1');
next();
})
app.use(function(req, res, next) {
console.log('f2');
if (count > 1) {
res.send('Bye');
} else {
next();
}
})
app.use(function(req, res, next) {
console.log('f3');
count++;
next();
})
app.get('/', function (req, res) {
res.send('Hello World: ' + count);
});
var server = app.listen(3000);
这是一个示例服务器,显示它可以正常工作
TreeExpansionListener
您将看到3个请求之后,服务器显示“Bye”并且未到达f3