Не можете вызвать next () как последний компонент промежуточного программного обеспечения? - PullRequest
0 голосов
/ 21 мая 2018

По какой-то причине, если я последний кусок промежуточного программного обеспечения и пытаюсь вызвать функцию next(), я получаю ту же ошибку, что и эта общая проблема 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 и хочу, чтобы я правильно понял материал.

1 Ответ

0 голосов
/ 21 мая 2018

Оказывается, я пропустил ключевую информацию как из аналогичного ответа, так и из моего расследования: если вызван next() и не осталось ничего для выполнения в отношении промежуточного программного обеспечения, сервер отправит сообщение Cannot GET /(route name),Для меня мой обратный вызов выполнялся после того, как это сообщение было отправлено, так как next() должен вызвать функцию, которая пишет этот ответ по умолчанию.

Следовательно, поскольку Express уже отправил сообщение Cannot GET /(routename), как только сработал обратный вызов, после чего он не смог отправить ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...