Ich bin ziemlich neu bei Node.js und habe einige Probleme.
Ich verwende Node.js 4.10 und Express 2.4.3.
Wenn ich versuche, auf http://127.0.0.1:8888/auth/facebook zuzugreifen , werde ich zu http://127.0.0.1:8888/auth/facebook_callback weitergeleitet .
Ich habe dann folgenden Fehler erhalten:
Error: Can't render headers after they are sent to the client.
at ServerResponse.<anonymous> (http.js:573:11)
at ServerResponse._renderHeaders (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/patch.js:64:25)
at ServerResponse.writeHead (http.js:813:20)
at /home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect-auth/lib/auth.strategies/facebook.js:28:15
at /home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect-auth/lib/index.js:113:13
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect-auth/lib/strategyExecutor.js:45:39)
at [object Object].pass (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect-auth/lib/authExecutionScope.js:32:3)
at [object Object].halt (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect-auth/lib/authExecutionScope.js:29:8)
at [object Object].redirect (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect-auth/lib/authExecutionScope.js:16:8)
at [object Object].<anonymous> (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect-auth/lib/auth.strategies/facebook.js:77:15)
Error: Can't set headers after they are sent.
at ServerResponse.<anonymous> (http.js:527:11)
at ServerResponse.setHeader (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/patch.js:50:20)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:162:13)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:195:11)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:150:23)
at param (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/middleware/router.js:189:13)
at pass (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/middleware/router.js:191:10)
at Object.router [as handle] (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/middleware/router.js:197:6)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:198:15)
at Object.auth [as handle] (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect-auth/lib/index.js:153:7)
Error: Can't set headers after they are sent.
at ServerResponse.<anonymous> (http.js:527:11)
at ServerResponse.setHeader (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/patch.js:50:20)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:162:13)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:207:9)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:150:23)
at param (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/middleware/router.js:189:13)
at pass (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/middleware/router.js:191:10)
at Object.router [as handle] (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/middleware/router.js:197:6)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:198:15)
at Object.auth [as handle] (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect-auth/lib/index.js:153:7)
Error: Can't set headers after they are sent.
at ServerResponse.<anonymous> (http.js:527:11)
at ServerResponse.setHeader (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/patch.js:50:20)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:162:13)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:150:23)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:207:9)
at Object.auth [as handle] (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect-auth/lib/index.js:153:7)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:198:15)
at HTTPServer.handle (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:211:3)
at Object.handle (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:105:14)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:198:15)
Error: Can't set headers after they are sent.
at ServerResponse.<anonymous> (http.js:527:11)
at ServerResponse.setHeader (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/patch.js:50:20)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:162:13)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:150:23)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:207:9)
at HTTPServer.handle (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:211:3)
at Object.handle (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:105:14)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:198:15)
at /home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/middleware/session.js:323:9
at /home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/middleware/session.js:338:9
node.js:134
throw e; // process.nextTick error, or 'error' event on first tick
^
Error: Can't set headers after they are sent.
at ServerResponse.<anonymous> (http.js:527:11)
at ServerResponse.setHeader (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/patch.js:50:20)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:162:13)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:207:9)
at /home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/middleware/session.js:323:9
at /home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/middleware/session.js:338:9
at Array.<anonymous> (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/middleware/session/memory.js:57:7)
at EventEmitter._tickCallback (node.js:126:26)
Folgendes ist mein Code:
var fbId= "XXX";
var fbSecret= "XXXXXX";
var fbCallbackAddress= "http://127.0.0.1:8888/auth/facebook_callback"
var cookieSecret = "node"; // enter a random hash for security
var express= require('express');
var auth = require('connect-auth')
var app = express.createServer();
app.configure(function(){
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(express.cookieParser());
app.use(express.session({secret: cookieSecret}));
app.use(auth([
auth.Facebook({
appId : fbId,
appSecret: fbSecret,
callback: fbCallbackAddress,
scope: 'offline_access,email,user_about_me,user_activities,manage_pages,publish_stream',
failedUri: '/noauth'
})
]));
app.use(app.router);
});
app.get('/auth/facebook', function(req, res) {
req.authenticate("facebook", function(error, authenticated) {
if (authenticated) {
res.redirect("/great");
console.log("ok cool.");
console.log(res['req']['session']);
}
});
});
app.get('/noauth', function(req, res) {
console.log('Authentication Failed');
res.send('Authentication Failed');
});
app.get('/great', function( req, res) {
res.send('Supercoolstuff');
});
app.listen(8888);
Darf ich wissen, was mit meinem Code nicht stimmt?
javascript
node.js
express
DjangoRocks
quelle
quelle
Antworten:
Das
res
Objekt in Express ist eine Unterklasse von Node.jshttp.ServerResponse
( lesen Sie die http.js-Quelle ). Sie könnenres.setHeader(name, value)
so oft anrufen, wie Sie möchten, bis Sie anrufenres.writeHead(statusCode)
. DanachwriteHead
werden die Header eingebrannt und Sie können nur noch anrufenres.write(data)
und schließlichres.end(data)
.Der Fehler "Fehler: Header können nach dem Senden nicht festgelegt werden." bedeutet, dass Sie sich bereits im Status "Körper" oder "Fertig" befinden, aber eine Funktion versucht hat, einen Header oder Statuscode festzulegen. Wenn Sie diesen Fehler sehen, versuchen Sie, nach etwas zu suchen, das versucht, einen Header zu senden, nachdem ein Teil des Körpers bereits geschrieben wurde. Suchen Sie beispielsweise nach Rückrufen, die versehentlich zweimal aufgerufen werden, oder nach Fehlern, die nach dem Senden des Körpers auftreten.
In Ihrem Fall haben Sie angerufen
res.redirect()
, wodurch die Antwort beendet wurde. Dann hat Ihr Code einen Fehler ausgelöst (res.req
istnull
). und da der Fehler innerhalb Ihres tatsächlichenfunction(req, res, next)
(nicht innerhalb eines Rückrufs) aufgetreten ist, konnte Connect ihn abfangen und versuchte dann, eine 500-Fehler-Seite zu senden. Da die Header jedoch bereits gesendet wurden, hat Node.jssetHeader
den Fehler ausgelöst, den Sie gesehen haben.Umfassende Liste der Node.js / Express-Antwortmethoden und wann sie aufgerufen werden müssen:
Die Antwort muss im Kopf sein und bleibt im Kopf :
res.writeContinue()
res.statusCode = 404
res.setHeader(name, value)
res.getHeader(name)
res.removeHeader(name)
res.header(key[, val])
(Nur Express)res.charset = 'utf-8'
(Nur Express; betrifft nur Express-spezifische Methoden)res.contentType(type)
(Nur Express)Die Antwort muss im Kopf sein und wird zum Körper :
res.writeHead(statusCode, [reasonPhrase], [headers])
Die Reaktion kann in Kopf / Körper erfolgen und bleibt im Körper :
res.write(chunk, encoding='utf8')
Die Antwort kann entweder in Kopf / Körper erfolgen und wird beendet :
res.end([data], [encoding])
Die Reaktion kann entweder in Kopf / Körper erfolgen und bleibt in ihrem aktuellen Zustand:
res.addTrailers(headers)
Die Antwort muss im Kopf sein und wird beendet :
return next([err])
(Nur Connect / Express)function(req, res, next)
(nur Connect / Express)res.send(body|status[, headers|status[, status]])
(Nur Express)res.attachment(filename)
(Nur Express)res.sendfile(path[, options[, callback]])
(Nur Express)res.json(obj[, headers|status[, status]])
(Nur Express)res.redirect(url[, status])
(Nur Express)res.cookie(name, val[, options])
(Nur Express)res.clearCookie(name[, options])
(Nur Express)res.render(view[, options[, fn]])
(Nur Express)res.partial(view[, options])
(Nur Express)quelle
return
vorher nicht gemacht habenext()
, danke, das hat mich auf den Fehler hingewiesen!Ich bin auch eine Weile auf diesen Fehler gestoßen. Ich denke (hoffe), ich habe meinen Kopf darum gewickelt und wollte es hier als Referenz schreiben.
Wenn Sie Middleware hinzufügen, um mithilfe der Methode eine Verbindung herzustellen oder auszudrücken (die auf connect basiert), hängen
app.use
Sie Elemente anServer.prototype.stack
connect an (zumindest mit der aktuellennpm install connect
, die ab diesem Beitrag ganz anders aussieht als die eines Githubs). Wenn der Server eine Anforderung erhält, durchläuft er den Stapel und ruft die(request, response, next)
Methode auf.Das Problem ist, wenn in einem der Middleware-Elemente in den Antworttext oder die Header geschrieben wird (es sieht so aus, als ob es entweder / oder aus irgendeinem Grund ist), aber nicht aufgerufen wird
response.end()
und Sienext()
dann aufrufen, wenn die KernmethodeServer.prototype.handle
abgeschlossen ist, wird es bemerken Das:response.headerSent
ist wahrEs wird also ein Fehler ausgegeben. Der Fehler ist jedoch nur diese grundlegende Antwort (aus dem Connect-
http.js
Quellcode:Genau dort ist es ein Aufruf
res.setHeader('Content-Type', 'text/plain');
, den Sie wahrscheinlich in Ihrerrender
Methode festgelegt haben, ohne response.end () aufzurufen , etwa:Die Art und Weise, wie alles strukturiert werden muss, ist wie folgt:
Gute Middleware
Problematische Middleware
Die problematische Middleware setzt den Antwortheader ohne Aufruf
response.end()
und Aufrufenext()
, was den Server von connect verwirrt.quelle
Einige der Antworten in diesen Fragen und Antworten sind falsch. Die akzeptierte Antwort ist auch nicht sehr "praktisch", daher möchte ich eine Antwort veröffentlichen, die die Dinge in einfacheren Begriffen erklärt. Meine Antwort deckt 99% der Fehler ab, die ich immer wieder sehe. Die tatsächlichen Gründe für den Fehler finden Sie in der akzeptierten Antwort.
HTTP verwendet einen Zyklus, der eine Antwort pro Anforderung erfordert. Wenn der Client eine Anfrage sendet (z. B. POST oder GET), sollte der Server nur eine Antwort an ihn zurücksenden.
Diese Fehlermeldung:
Dies geschieht normalerweise, wenn Sie mehrere Antworten für eine Anfrage senden. Stellen Sie sicher, dass die folgenden Funktionen nur einmal pro Anforderung aufgerufen werden:
res.json()
res.send()
res.redirect()
res.render()
(und einige weitere, die selten verwendet werden, überprüfen Sie die akzeptierte Antwort)
Der Routenrückruf wird nicht zurückgegeben, wenn diese Res-Funktionen aufgerufen werden. Es wird so lange ausgeführt, bis das Ende der Funktion oder eine return-Anweisung erreicht ist. Wenn Sie beim Senden einer Antwort zurückkehren möchten, können Sie dies folgendermaßen tun :
return res.send()
.Nehmen Sie zum Beispiel diesen Code:
Wenn eine POST-Anforderung an / api / route1 gesendet wird, wird jede Zeile im Rückruf ausgeführt. A Header können nach dem Senden nicht festgelegt werden. Die Fehlermeldung wird ausgelöst, da
res.json()
sie zweimal aufgerufen wird. Dies bedeutet, dass zwei Antworten gesendet werden.Pro Anfrage kann nur eine Antwort gesendet werden!
Der Fehler im obigen Codebeispiel war offensichtlich. Ein typischeres Problem ist, wenn Sie mehrere Zweige haben:
Diese Route mit angehängtem Rückruf findet eine Firma in einer Datenbank. Wenn wir eine Abfrage für ein Unternehmen durchführen, das nicht existiert, werden wir in die
else if
Filiale gelangen und eine 404-Antwort senden. Danach fahren wir mit der nächsten Anweisung fort, die ebenfalls eine Antwort sendet. Jetzt haben wir zwei Antworten gesendet und die Fehlermeldung wird auftreten. Wir können diesen Code beheben, indem wir sicherstellen, dass wir nur eine Antwort senden:oder indem Sie zurückkehren, wenn die Antwort gesendet wird:
Ein großer Sünder sind asynchrone Funktionen. Nehmen Sie zum Beispiel die Funktion aus dieser Frage:
Hier haben wir eine asynchrone Funktion (
findOneAndUpdate()
) im Codebeispiel. Wenn keine Fehler vorliegen, wird (err
)findOneAndUpdate()
aufgerufen. Da diese Funktion asynchron ist,res.json(doc1)
wird die sofort aufgerufen. Angenommen, es gibt keine Fehler infindOneAndUpdate()
. Dieres.json(doc2)
imelse
Willen werden dann aufgerufen. Es wurden nun zwei Antworten gesendet, und die Fehlermeldung " Header können nicht festgelegt werden" wird angezeigt .In diesem Fall besteht die Lösung darin, das zu entfernen
res.json(doc1)
. Um beide Dokumente an den Client zurückzusenden, könnte dasres.json()
in else als geschrieben werdenres.json({ article: doc1, user: doc2 })
.quelle
return
dieres.json
res.send
for-Schleife.Ich hatte das gleiche Problem und stellte fest, dass ich
res.redirect
ohnereturn
Anweisungnext
aufrief , sodass die Funktion auch unmittelbar danach aufgerufen wurde:Welches hätte sein sollen:
quelle
Viele Leute haben diesen Fehler gemacht. Es ist verwirrend mit der asynchronen Verarbeitung. Höchstwahrscheinlich setzt ein Teil Ihres Codes Header im ersten Tick und dann führen Sie in einem zukünftigen Tick einen asynchronen Rückruf aus. Zwischendurch wird der Antwortheader gesendet, aber dann versuchen weitere Header (wie eine 30-fache Umleitung), zusätzliche Header hinzuzufügen. Es ist jedoch zu spät, da der Antwortheader bereits übertragen wurde.
Ich bin mir nicht sicher, was genau Ihren Fehler verursacht, aber ich betrachte Rückrufe als potenzielle Bereiche, die untersucht werden müssen.
Ein einfacher Tipp zur Vereinfachung Ihres Codes. Werde los
app.configure()
und rufe einfachapp.use
direkt in deinem Top-Level-Bereich an.Siehe auch das everyauth- Modul, das Facebook und etwa ein Dutzend anderer Authentifizierungsanbieter von Drittanbietern unterstützt.
quelle
Ich habe meinen Kopf über dieses Problem gekocht und es ist aufgrund eines unachtsamen Fehlers bei der Behandlung der Rückrufe passiert. Nicht zurückgegebene Rückrufe bewirken, dass die Antwort zweimal festgelegt wird.!
Mein Programm hatte einen Code, der die Anforderung validiert und die Datenbank abfragt. Nach der Überprüfung, ob ein Fehler vorliegt, habe ich die Datei index.js mit den Überprüfungsfehlern zurückgerufen. Und wenn die Validierung erfolgreich ist, wird die Datenbank mit Erfolg / Misserfolg erreicht.
Was geschah, ist: Wenn die Validierung fehlschlägt, wird der Rückruf aufgerufen und die Antwort festgelegt. Aber nicht zurückgekehrt. Also geht es weiter, die Methode geht zu db und trifft Erfolg / Misserfolg. Es ruft denselben Rückruf erneut auf, wodurch die Antwort jetzt zweimal festgelegt wird.
Die Lösung ist also einfach. Sie müssen den Rückruf zurückgeben, damit die Methode nicht weiter ausgeführt wird, sobald der Fehler aufgetreten ist, und daher das Antwortobjekt einmal festlegen
quelle
callback(...)
ohnereturn;
danach gefunden, was schließlich dazu führteres.send(...)
, dass es zweimal aufgerufen wurde.Diese Art von Fehler wird angezeigt, wenn Sie nach dem Senden einer Antwort Anweisungen übergeben.
Zum Beispiel:
Dies führt zu dem Fehler, den Sie sehen, da nach dem Senden der Antwort Folgendes
res.send
nicht ausgeführt wird.Wenn Sie etwas tun möchten, sollten Sie dies tun, bevor Sie die Antwort senden.
quelle
Manchmal kann dieser Fehler auftreten, wenn Sie versuchen, die Funktion next () nach res.end oder res.send aufzurufen . Versuchen Sie zu löschen, wenn Sie next () nach res.send oder res.end in Ihrer Funktion haben. Hinweis: Hier bedeutet next (), dass Sie nach der Antwort auf den Client mit Ihrer Antwort ( dh res.send oder res.end ) immer noch versuchen, Code auszuführen, um erneut zu antworten, sodass dies nicht legal ist.
Beispiel:
quelle
Wenn Sie Rückruffunktionen verwenden, verwenden Sie diese
return
nach demerr
Block. Dies ist eines der Szenarien, in denen dieser Fehler auftreten kann.Getestet auf Node-Version
v10.16.0
und Express4.16.4
quelle
Dieser Fehler tritt auf, wenn Sie 2 Antworten senden. Beispielsweise :
Stellen Sie sich vor, wenn aus irgendeinem Grund Bedingung A und B wahr sind, erhalten Sie im zweiten
render
Moment diesen Fehlerquelle
In meinem Fall war es eine 304-Antwort (Caching), die das Problem verursachte.
Einfachste Lösung:
Alternative Lösung hier, wenn Sie mehr Kontrolle wünschen:
http://vlasenko.org/2011/10/12/expressconnect-static-set-last-modified-to-now-to-avoid-304-not-modified/
quelle
In meinem Fall geschah dies mit React und postal.js, als ich mich im
componentWillUnmount
Rückruf meiner React-Komponente nicht von einem Kanal abmeldete .quelle
Für jeden, der dazu kommt, und keine der anderen Lösungen hat geholfen. In meinem Fall manifestierte sich dies auf einer Route, die das Hochladen von Bildern handhabte, aber keine Zeitüberschreitungen behandelte . Wenn der Upload also zu lange dauerte und eine Zeitüberschreitung auftrat , als der Rückruf ausgelöst wurde Nachdem die Timeout-Antwort gesendet wurde , führte der Aufruf von res.send () zum Absturz, da die Header bereits so eingestellt waren, dass sie das Timeout berücksichtigen.
Dies konnte leicht reproduziert werden, indem eine sehr kurze Zeitüberschreitung eingestellt und die Route mit einem anständig großen Bild getroffen wurde. Der Absturz wurde jedes Mal reproduziert.
quelle
Ich habe mich nur gelehnt. Sie können die Antworten über diese Funktion übergeben:
quelle
Fügen Sie diese Mittelware hinzu und es wird funktionieren
quelle
Dies geschieht, wenn die Antwort an den Client gesendet wurde und Sie erneut versuchen, eine Antwort zu geben. Sie müssen in Ihrem Code einchecken, dass Sie irgendwo erneut eine Antwort an den Client zurückgeben, die diesen Fehler verursacht. Überprüfen Sie die Antwort und geben Sie sie einmal zurück, wenn Sie zurückkehren möchten.
quelle
Ich hatte dieses Problem, als ich Versprechen verschachtelte. Ein Versprechen innerhalb eines Versprechens würde 200 an den Server zurückgeben, aber dann würde die catch-Anweisung des äußeren Versprechens 500 zurückgeben. Sobald ich dies behoben hatte, verschwand das Problem.
quelle
Kam von nuxt hierher , das Problem lag in der
asyncData
Methode der Komponente , ich habe vergessen zureturn
versprechen, welche Daten abruft und dort den Header setzt.quelle
Bitte überprüfen Sie, ob Ihr Code mehrere res.send () -Anweisungen für eine einzelne Anforderung zurückgibt. Wie als ich dieses Problem hatte ....
Ich war dieses Problem in meiner Restify Node-Anwendung. Der Fehler war das
switch (status) { case -1: res.send(400); case 0: res.send(200); default: res.send(500); }
Ich habe verschiedene Fälle mit einem Schalter bearbeitet, ohne eine Unterbrechung zu schreiben. Für diejenigen, die mit Switch Case wenig vertraut sind, wissen Sie, dass Sie ohne Unterbrechung Schlüsselwörter zurückgeben müssen. Der Code unter Groß- und Kleinschreibung und die nächsten Zeilen werden unabhängig davon ausgeführt. Obwohl ich eine einzelne res.send senden möchte, wurden aufgrund dieses Fehlers mehrere res.send-Anweisungen zurückgegeben, was dazu führte
switch (status) { case -1: res.send(400); break; case 0: res.send(200); break; default: res.send(500); break; }
quelle
Es ist sehr wahrscheinlich, dass dies eher eine Knotensache ist. In 99% der Fälle handelt es sich um einen doppelten Rückruf, der dazu führt, dass Sie zweimal antworten oder zweimal () zweimal usw.), verdammt sicher. Es löste mein Problem, next () in einer Schleife zu verwenden. Entfernen Sie das next () aus der Schleife oder beenden Sie den Aufruf mehrmals.
quelle
Ich habe einen ähnlichen Fehler erhalten, als ich versucht habe, eine Antwort innerhalb einer Schleifenfunktion zu senden. Die einfache Lösung bestand darin, die zu bewegen
außerhalb der Schleife, da Sie den Antwortheader nur einmal senden können.
https://www.tutorialspoint.com/nodejs/nodejs_response_object.htm
quelle
Ich füge einfach das Return-Schlüsselwort hinzu wie:
return res.redirect("/great");
und walla!quelle
Ich hatte das gleiche Problem, das durch Mungo verursacht wurde.
Um
Promises
dies zu beheben, müssen Sie Folgendes aktivieren , damit Sie Folgendes hinzufügen können:mongoose.Promise = global.Promise
zu Ihrem Code, der die Verwendung ermöglichtnative js promises
.Andere Alternativen zu dieser Lösung sind:
und
Sie müssen diese Pakete jedoch zuerst installieren.
quelle
Fehlersuche von selbst nach einem RND:
1) mein Fehlercode:
return res.sendStatus(200).json({ data: result });
2) mein Erfolgscode
return res.status(200).json({ data: result });
Der Unterschied ist, dass ich sendStatus () anstelle von status () verwendet habe .
quelle
In Typescript bestand mein Problem darin, dass ich die Websocket-Verbindung nach dem Empfang einer Nachricht nicht geschlossen habe.
quelle
Wenn Sie keine Hilfe von oben erhalten: für Noobs Der Grund für diesen Fehler ist das mehrmalige Senden einer Anfrage. Lassen Sie uns in einigen Fällen Folgendes verstehen: - 1. `
`Wenn Sie next () oben zweimal aufrufen, wird ein Fehler ausgelöst
router.delete('/:orderId', (req, res, next) => { Order.remove({_id:req.params.orderId},(err,data)=>{ if(err){ **res.status(500).json(err);** }else{ res.status(200).json(data); } *res.status(200).json(data);* }) })
Hier wird die Antwort zweimal gesendet. Überprüfen Sie, ob Sie bereits eine Antwort gesendet haben
quelle
In meinem Fall geschieht dies aufgrund mehrerer Rückrufe. Ich habe die
next()
Methode während des Codes mehrmals aufgerufenquelle
Mein Problem war, dass ich einen
setInterval
Lauf hatte, der einenif/else
Block hatte, in dem sich dieclearInterval
Methode befand inelse
:Putting the
clearInterval
before theif/else
hat den Trick gemacht.quelle
In meinem Fall, in einer Schleife, habe ich
res.render()
möglicherweise versucht, mehrmals aufzurufen.quelle
Im Falle dieses Fehlers musste ich nur res.end () tun.
Das andere Problem, mit dem Sie möglicherweise konfrontiert sind, ist der Code nach res.json und res. schreiben. In diesem Fall müssen Sie return verwenden, um die Ausführung danach zu stoppen.
quelle