Я начинаю работать с Express JS и сталкиваюсь с проблемой. Я не могу понять, как правильно обрабатывать ошибки.
Например, у меня есть API веб-сервисов, который обслуживает объект, называемый "событие". Я хотел бы вернуть простую строку "не могу найти событие", когда пользователь отправляет идентификатор события, который не найден. Вот как я сейчас структурирую свой код:
app.get('/event/:id', function(req, res, next) {
if (req.params.id != 1) {
next(new Error('cannot find event ' + req.params.id));
}
req.send('event found!');
});
Когда я отправляю идентификатор, отличный от 1, Node выходит со следующим выходом:
http.js:527
throw new Error("Can't set headers after they are sent.");
^
Error: Can't set headers after they are sent.
at ServerResponse.<anonymous> (http.js:527:11)
at ServerResponse.setHeader (/usr/local/kayak/node_modules/express/node_modules/connect/lib/patch.js:62:20)
at /usr/local/kayak/node_modules/express/node_modules/connect/lib/middleware/errorHandler.js:72:19
at [object Object].<anonymous> (fs.js:107:5)
at [object Object].emit (events.js:61:17)
at afterRead (fs.js:878:12)
at wrapper (fs.js:245:17)
Из того, что я могу сказать, используя отладчик node.js, выполнение блока кода продолжается после вызова next()
, что означает, что req.send('event found!')
пытается запустить. Я не хочу, чтобы это произошло.
Единственным обходным решением, которое я нашел, является просто выбросить new Error()
вместо "next-ing", но это приводит к созданию страницы ошибки HTML Express по умолчанию. Я бы хотел получить немного больше контроля.
Я потратил время, чтобы прочитать раздел обработки ошибок документации Express, но я не мог этого понять.