"Ошибка: невозможно установить заголовки после их отправки" в приложении 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);
});
Другие вопросы по тегам