不能将next()作为最后一块中间件调用吗?

时间:2018-05-21 04:48:39

标签: node.js express

出于某种原因,如果我是最后一块中间件并且我尝试调用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 ;我正确理解的东西。

1 个答案:

答案 0 :(得分:0)

事实证明,我从相似的答案和我的调查中遗漏了一条关键信息:如果调用next()并且没有任何内容可以执行,则服务器将发送消息{ {1}}。对我来说,我的回调是在发送此消息后执行的,因为Cannot GET /(route name)必须调用写入此默认响应的函数。

因此,由于Express已经发送了消息next(),一旦回调被触发,之后,它就无法发送响应。