"Ошибка: невозможно установить заголовки после их отправки" в приложении Express с Node
Я новичок в Express и Node, и при тестировании защищенной конечной точки REST в моем приложении с использованием Advanced REST Client данные возвращаются из конечной точки клиенту, как и ожидалось, однако консоль регистрирует журнал
"Error: Can't set headers after they are sent"
который останавливает сервер. Поиск здесь в SO, кажется, происходит при отправке более одного ответа, но я не вижу этого в своем коде:
router.get('/books', userAuthenticated, function (req, res, next) {
Book.find({}, function(err, docs){
if(err) {
res.send(err)
} else {
res.send(docs);
// next();
// return;
}
})
});
Ожидается ли эта ошибка при отправке запроса / ответа на клиент или с клиента или я что-то упускаю при обработке ошибки на сервере?
2 ответа
Express - это сервер node.js, который имеет концепцию, называемую "промежуточное программное обеспечение", где несколько уровней кода получают возможность работать по запросу.
В этом случае вам нужно не только проверить, что ваша функция не отправляет ответ дважды, но и проверить, что другое промежуточное ПО также не отправляет ответ.
В вашем случае код указывает, что промежуточное программное обеспечение с именем "userAuthenticated" вызывается перед этой функцией. Вы должны проверить, отправляет ли промежуточное ПО ответ.
I don't think the problem was in the middleware. It looks like I was calling done() twice in passport deserialize. I commented out the first instance and the problem disappeared in all my routes. Although, I am not sure if I should comment out the first or second instance but I'll work on that next.
passport.deserializeUser(function(obj, done) {
console.log(obj);
Account.findById(obj, function(err, user) {
console.log(user);
//done(err, user);
});
return done(null, obj);
});