2016-10-18 3 views
0

Я новичок в 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; 
     } 
    }) 
}); 

Является ли эта ошибка ожидается, при отправке запроса/ответа на/от Клиента или я Я пропустил что-то в обработке ошибки на сервере?

+0

Лучше всего предположить, что пользовательское аутентифицированное промежуточное программное обеспечение отправит ответ. проверьте эту функцию, убедитесь, что res не отправлен перед вызовом next() – Brian

+0

Вот прокомментированное промежуточное программное обеспечение UserAuthenticated, которое я реорганизовал как можно проще, но все же ту же ошибку: function userAuthenticated (req, res, next) { if (req. isAuthenticated()) { return next(); } res.redirect ('/ notloggedin'); } – user2232681

+0

Проверьте ответ на свой браузер или почтальон. откройте консоль dev, перейдите в сеть, затем проверьте запрос/книги – Brian

ответ

0

Экспресс является сервером node.js, который имеет концепцию, называемую «промежуточное ПО», где несколько уровней кода получают возможность работать по запросу.

В этом случае вам нужно не только проверить, что ваша функция не отправляет ответ дважды, но вы должны проверить, не отправляет ли другое промежуточное программное обеспечение ответ.

В вашем случае код указывает, что перед этой функцией вызывается промежуточное программное обеспечение, называемое «userAuthenticated». Вы должны проверить, уже ли это промежуточное ПО отправляет ответ.

+0

Вот прокомментированное промежуточное программное обеспечение UserAuthenticated, которое я реорганизовал как можно проще, но все же ту же ошибку: function userAuthenticated (req, res, next) {if (req.isAuthenticated()) {return next(); } res.redirect ('/ notloggedin'); } – user2232681

0
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); 
});