2016-10-18 3 views
0

Ich bin neu zu Express und Knoten, und beim Testen eines geschützten REST-Endpunkts in meiner App mit Advanced REST Client die Daten vom Endpunkt zurückgegeben werden an den Client wie erwartet, aber die Konsole Protokolle"Fehler: kann Header nicht festlegen, nachdem sie gesendet werden" in Express-App mit Knoten

"Error: Can't set headers after they are sent" 

, die den Server stoppt. Such hier auf SO, scheint dies geschehen kann, wenn mehr als eine Antwort zu senden, aber ich weiß nicht, dass in meinem Code sehen:

router.get('/books', userAuthenticated, function (req, res, next) { 
    Book.find({}, function(err, docs){ 
     if(err) { 
      res.send(err) 
     } else { 
      res.send(docs); 
      // next(); 
      // return; 
     } 
    }) 
}); 

Ist dieser Fehler zu erwarten, wenn eine Anforderung/Antwort auf/von dem Kunden zu senden oder am Ich vermisse etwas im Umgang mit dem Fehler auf dem Server?

+0

Beste Schätzung wäre UserAuthenticated Middleware sendet eine Antwort. Überprüfen Sie diese Funktion, stellen Sie sicher, dass res nicht vor dem nächsten Aufruf gesendet wird() – Brian

+0

Hier ist die userAuthenticated-Middleware, die ich so einfach wie ich kann, aber immer noch den gleichen Fehler: function userAuthenticated (req, res, next) { if (req. isAuthenticated()) { return next(); } res.redirect ('/ notloggedin'); } – user2232681

+0

überprüfen Sie die Antwort in Ihrem Browser oder Postbote. Öffnen Sie die Dev-Konsole, gehen Sie zum Netzwerk, und überprüfen Sie die Anfrage für/books – Brian

Antwort

0

Express ist ein node.js-Server, der ein Konzept namens "Middleware" bietet, bei dem mehrere Codeebenen die Möglichkeit erhalten, auf eine Anfrage zuzugreifen.

In diesem Fall müssen Sie nicht nur überprüfen, dass Ihre Funktion keine Antwort zweimal sendet, sondern Sie müssen überprüfen, dass andere Middleware keine Antwort zurücksenden.

In Ihrem Fall gibt der Code an, dass Middleware namens "userAuthenticated" vor dieser Funktion aufgerufen wird. Sie sollten überprüfen, ob diese Middleware bereits eine Antwort sendet.

+0

Hier ist die userAuthenticated Middleware, die ich so einfach wie ich kann, aber immer noch den gleichen Fehler: 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); 
}); 
Verwandte Themen