出于某种原因,如果我是最后一块中间件并且我尝试调用next()
函数,我会得到与this常见SO问题相同的错误。
所以我有一个最小的例子,我把它设置如下:
在我的路线中,我有:
router.get('/add',(req,res,next) => {
res.render('ideas/add');
next();
});
然后我有了最后一块中间件:
app.use(function finalMiddleware(req,res,next){
console.log("We are here!");
console.log(app._router.stack);
next();
});
控制台将以下内容记录为堆栈中的最后一个元素:
Layer {
handle: [Function: finalMiddleware],
name: 'finalMiddleware',
params: {},
path: '',
keys: [],
regexp: { /^\/?(?=\/|$)/i fast_star: false, fast_slash: true },
route: undefined } ]
然而,我仍然得到:
Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
at ServerResponse.setHeader (_http_outgoing.js:471:11)
at ServerResponse.header (../node_modules/express/lib/response.js:767:10)
at ServerResponse.send (../node_modules/express/lib/response.js:170:12)
at done (../node_modules/express/lib/response.js:1004:10)
at Immediate.<anonymous> (../node_modules/express-handlebars/lib/utils.js:26:13)
我想知道这是否由于某种原因与把手有关?我只是不明白为什么如果我不用后来的中间件编写标题,这可能是一个问题。我似乎无法弄清楚如何进一步调试它。当然,我可以从我的最后一块中间件中删除next()
电话,但我想了解是否有更深层次的事情,因为我是Express的新手,并希望制作我的#39 ;我正确理解的东西。
答案 0 :(得分:0)
事实证明,我从相似的答案和我的调查中遗漏了一条关键信息:如果调用next()
并且没有任何内容可以执行,则服务器将发送消息{ {1}}。对我来说,我的回调是在发送此消息后执行的,因为Cannot GET /(route name)
必须调用写入此默认响应的函数。
因此,由于Express已经发送了消息next()
,一旦回调被触发,之后,它就无法发送响应。