Beste Weg, um debug 'Kann nicht gesetzt-Header, nachdem Sie gesendet werden' Fehler in Express / Node.js?
Ich versuche zu Debuggen, die gefürchtete Can't set headers after they are sent
Fehler in einem node.js Express-Anwendung. Insbesondere bin ich mit der knox Bibliothek zu reden s3.
Etwa, ich habe diese Express-handler, mit einer globalen Instanz einer knox s3client:
function foo(req, res) {
//Region A
var s3req = global.s3client.get('foo').on('response', function(s3res){
//Region B
res.set('content-length', s3res.headers['content-length']); //This will fail
s3res.on('data', function(chunk){
res.write(chunk);
});
});
//Region C
s3req.end();
}
Wenn ich Kopf-oder status-code auf res
in der Region Ein, funktioniert alles einwandfrei. Wenn ich versuche, allen, die in Region B, erhalte ich "Can' T set Kopfzeilen, nachdem Sie gesendet werden" - Fehler. Beachten Sie, dass ich möchte, um Header zu setzen auf res
, nicht s3res
Vermutlich response.writeHead
aufgerufen oder ausgelöst, irgendwo vor der Reaktion Rückruf der knox s3client aufgerufen wird. Gibt es irgendein debug-flag oder einen anderen Weg, der Knoten ausspucken Wann/wo writeHead aufgerufen wurde? Knoten 0.10 fügt eine response.headersSent
, aber es wäre extrem schwer zu füllen mein code und alle 3rd-party-Bibliotheken mit einem Scheck von dieser Flagge, um herauszufinden, wo diese immer genannt. Oder ist es irgendwie etwas anderes, um herauszufinden, dieses problem?
- Ich begegne dieser vor einiger Zeit. kann ich empfehlen, zu versuchen, eine andere version der express zunächst, d.h. ein upgrade oder downgrade Ihres express.js.
- Ich habe versucht, sowohl die Express 3.1 und 3.2.1. Ich habe auch versucht den Knoten 0.10.3 und Knoten 0.10.5
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnten Sie versuchen, eine einfache middleware, die dumps einen stack-trace zu stdout
writeHead
heißt:Müssen Sie, dass, bevor Sie Routen/middleware dass auslösen könnte Ihr problem.
FWIW, meine Vermutung wäre, dass das problem durch etwas ausgelöst, was geschieht, in region C (entweder ein
res.send
,res.end
,res.json
oderres.render
wird es genannt):BEARBEITEN wenn
s3res
ist eine ordnungsgemäße stream, können Sie versuchen, diese:Aber bewusst sein, dass alle Header zurückgegeben, die durch die S3-Anfrage übergeben werden, um die Express-Antwort.
Error: socket hang up
. Wenn ich nur streamen will, s3res zurück zu foo res und set content-type sowie den content-length-Header, was ist hier die beste Lösung?s3req.end()
sollte nicht das problem sein, das ist nicht Teil des Express. Ich denke, es hängt vom Kontext ab, in die Sie nennenfoo()
, obwohl (wie @wayne bereits vorgeschlagen) ich darf auch daran erinnern, einige Probleme mit Knoten generieren würde dieses problem ohne ersichtlichen Grund.Ich bin mir nicht sicher, ob es hier gilt, was ich aber sofort gedacht, als dass der Fehler Auftritt, wurde eine einfache sehr einfache Fehler in "callback-Logik" irgendwo in der "Modell-Ebene". Ich hatte schon Kopf kratzen über diese in zwei separate Instanzen, in beiden Fällen stellte sich heraus, dass ich als ein callback (d.h. eine, schließlich wäre das Antwort-schreiben Rückruf) zweimal. Dies würde geschehen, nur auf einen Fehler in meinem Modell-Ebene, denn es war ein code wie:
Wenn ich in solch ein Fehler nun, die erste Sache, die ich tun würde, um zu überprüfen, ob die Antwort-schreiben von callback wird aufgerufen, zweimal für jeden Betrieb. Einfach zwei
console.log
Parolen, die man in der region Ein (der Bereich, wo der Knox-Anforderung initiiert wird) und in region C (das Antwort-schreiben Rückruf) würde ausreichen, um zumindest beseitigen diese Möglichkeit.Grundsätzlich
res
Objekt sollte ziemlich geschützt. Nur connect /express-middleware Zugriff darauf hat, und dieser spezielle request-handler natürlich. So gibt es nur eine begrenzte Anzahl von Plätzen, die die macht haben, einen header geschrieben wird.