代码之家  ›  专栏  ›  技术社区  ›  rb612

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

  •  0
  • rb612  · 技术社区  · 6 年前

    出于某种原因,如果我是中间件的最后一块,我尝试调用 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)
    

    我想知道这和车把有关吗?我只是不明白,如果我不使用以后的中间件编写头部,这可能是一个问题。我似乎不知道如何进一步调试它。当然,我可以把 下() 从我的最后一个中间件调用,但是我想了解是否有更深层的事情发生,因为我是新来表达的,并且想让我正确地理解一些东西。

    1 回复  |  直到 6 年前
        1
  •  0
  •   rb612    6 年前

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

    因此,因为Express已经发送了消息 Cannot GET /(routename) ,回调一启动,它就无法发送响应。