it-swarm.com.de

Fehler: Es können keine Header gesetzt werden, nachdem sie an den Client gesendet wurden

Ich bin relativ 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 umgeleitet.

Ich habe dann folgende Fehlermeldung 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);

Kann ich wissen, was mit meinem Code falsch ist?

516
DjangoRocks

Das res-Objekt in Express ist eine Unterklasse von Node.js http.ServerResponse ( Quelle http.js lesen ). Sie können res.setHeader(name, value) so oft aufrufen, wie Sie möchten, bis Sie res.writeHead(statusCode) aufrufen. Nach writeHead werden die Header eingebettet und Sie können nur res.write(data) und schließlich res.end(data) aufrufen.

Der Fehler "Fehler: Header können nicht gesetzt werden, nachdem sie gesendet wurden." bedeutet, dass Sie sich bereits im Status "Körper" oder "Fertig" befinden, aber einige Funktionen haben versucht, einen Header oder Statuscode festzulegen. Wenn Sie diesen Fehler sehen, versuchen Sie, nach etwas zu suchen, das versucht, einen Header zu senden, nachdem bereits ein Teil des Texts geschrieben wurde. Suchen Sie beispielsweise nach Rückrufen, die versehentlich zweimal aufgerufen werden, oder nach Fehlern, die nach dem Senden des Hauptteils auftreten.

In Ihrem Fall haben Sie res.redirect() aufgerufen, wodurch die Antwort als "Fertig" angezeigt wurde. Dann hat Ihr Code einen Fehler ausgegeben (res.req ist null). Und da der Fehler in Ihrer eigentlichen function(req, res, next) (nicht in einem Rückruf) aufgetreten ist, konnte Connect ihn abfangen und versuchte, eine 500-Fehlerseite zu senden. Da die Header jedoch bereits gesendet wurden, hat setHeader von Node.js den Fehler ausgegeben, den Sie gesehen haben.

Umfassende Liste der Antwortmethoden Node.js/Express und wann sie aufgerufen werden müssen:

Antwort muss in Head sein und bleibt in Head:

  1. res.writeContinue()
  2. res.statusCode = 404
  3. res.setHeader(name, value)
  4. res.getHeader(name)
  5. res.removeHeader(name)
  6. res.header(key[, val]) (nur Express)
  7. res.charset = 'utf-8' (nur Express; betrifft nur Express-spezifische Methoden)
  8. res.contentType(type) (nur Express)

Antwort muss in Head sein und wird zu Body:

  1. res.writeHead(statusCode, [reasonPhrase], [headers])

Antwort kann entweder in Head/Body sein und bleibt in Body:

  1. res.write(chunk, encoding='utf8')

Antwort kann entweder in Head/Body sein und wird zu Finished:

  1. res.end([data], [encoding])

Antwort kann entweder in Head/Body sein und bleibt in ihrem aktuellen Zustand

  1. res.addTrailers(headers)

Antwort muss in Head sein und wird zu Finished:

  1. return next([err]) (nur Connect/Express)
  2. Ausnahmen innerhalb der Middleware function(req, res, next) (nur Connect/Express)
  3. res.send(body|status[, headers|status[, status]]) (nur Express)
  4. res.attachment(filename) (nur Express)
  5. res.sendfile(path[, options[, callback]]) (nur Express)
  6. res.json(obj[, headers|status[, status]]) (nur Express)
  7. res.redirect(url[, status]) (nur Express)
  8. res.cookie(name, val[, options]) (nur Express)
  9. res.clearCookie(name[, options]) (nur Express)
  10. res.render(view[, options[, fn]]) (nur Express)
  11. res.partial(view[, options]) (nur Express)
840
yonran

Ich bin auch eine Weile auf diesen Fehler gestoßen. Ich glaube, ich habe meinen Kopf darum gewickelt und wollte ihn hier als Referenz schreiben.

Wenn Sie Middleware zu connect oder express (die auf connect aufgebaut ist) mit der app.use-Methode hinzufügen, hängen Sie Elemente an Server.prototype.stack in connect an (zumindest mit dem aktuellen npm install connect, der sich ganz anders darstellt der eine github ab diesem Beitrag). Wenn der Server eine Anforderung erhält, durchläuft er den Stack und ruft die (request, response, next)-Methode auf.

Das Problem ist, wenn in einem der Middleware-Elemente in den Antworttext oder in die Header geschrieben wird (es scheint entweder/oder aus irgendeinem Grund), ruft jedoch nicht response.end() auf, und Sie rufen next() und dann den Kern Server.prototype.handle auf. Methode abgeschlossen, wird es folgendes bemerken:

  1. es befinden sich keine weiteren Gegenstände im Stapel und/oder
  2. dass response.headerSent wahr ist.

Also wirft es einen Fehler. Der Fehler, den es auslöst, ist jedoch genau diese grundlegende Antwort (aus dem Quellcode von connect http.js:

res.statusCode = 404;
res.setHeader('Content-Type', 'text/plain');
res.end('Cannot ' + req.method + ' ' + req.url);

Genau dort ruft es res.setHeader('Content-Type', 'text/plain'); auf, das Sie wahrscheinlich in Ihrer render-Methode gesetzt haben, ohne response.end () aufzurufen.

response.setHeader("Content-Type", "text/html");
response.write("<p>Hello World</p>");

So muss alles strukturiert sein:

Gute Middleware

// middleware that does not modify the response body
var doesNotModifyBody = function(request, response, next) {
  request.params = {
    a: "b"
  };
  // calls next because it hasn't modified the header
  next();
};

// middleware that modify the response body
var doesModifyBody = function(request, response, next) {
  response.setHeader("Content-Type", "text/html");
  response.write("<p>Hello World</p>");
  response.end();
  // doesn't call next()
};

app.use(doesNotModifyBody);
app.use(doesModifyBody);

Problematische Middleware

var problemMiddleware = function(request, response, next) {
  response.setHeader("Content-Type", "text/html");
  response.write("<p>Hello World</p>");
  next();
};

Die problematische Middleware setzt den Antwortheader ohne Aufruf von response.end() und ruft next() auf, wodurch der Server von connect verwirrt wird.

80
Lance Pollard

Ich hatte das gleiche Problem und erkannte, dass ich res.redirect ohne eine return-Anweisung aufgerufen hatte. Die next-Funktion wurde unmittelbar danach ebenfalls aufgerufen:

auth.annonymousOnly = function(req, res, next) {
    if (req.user) res.redirect('/');
    next();
};

Was hätte sein sollen:

auth.annonymousOnly = function(req, res, next) {
    if (req.user) return res.redirect('/');
    next();
};
37
ergusto

Einige der Antworten in diesen Fragen und Antworten sind falsch. Die akzeptierte Antwort ist auch nicht sehr "praktisch", deshalb möchte ich eine Antwort posten, 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 Anforderung sendet (z. B. POST oder GET)), sollte der Server nur eine Antwort an ihn zurücksenden.

Diese Fehlermeldung:

Fehler: Header können nach dem Senden nicht gesetzt werden.

in der Regel passiert dies, wenn Sie mehrere Antworten auf 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 nur 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 es das Ende der Funktion oder eine return-Anweisung erreicht. 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:

app.post('/api/route1', function(req, res) {
  console.log('this ran');
  res.status(200).json({ message: 'ok' });
  console.log('this ran too');
  res.status(200).json({ message: 'ok' });
}

Wenn eine POST Anfrage an /api/route1 gesendet wird, wird jede Zeile im Rückruf ausgeführt. A Header können nach dem Senden nicht gesetzt werden Fehlermeldung wird ausgegeben, da res.json() zweimal aufgerufen wird, dh es werden zwei Antworten gesendet.

Pro Anfrage kann nur eine Antwort gesendet werden!


Der Fehler im obigen Codebeispiel war offensichtlich. Ein typischeres Problem ist, wenn Sie mehrere Zweige haben:

app.get('/api/company/:companyId', function(req, res) {
  const { companyId } = req.params;
  Company.findById(companyId).exec((err, company) => {
      if (err) {
        res.status(500).json(err);
      } else if (!company) {
        res.status(404).json();      // This runs.
      }
      res.status(200).json(company); // This runs as well.
    });
}

Diese Route mit angefügtem Rückruf findet eine Firma in einer Datenbank. Wenn wir eine Anfrage für ein Unternehmen stellen, das nicht existiert, gelangen wir in den Zweig else if Und senden eine 404-Antwort. 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 korrigieren, indem wir sicherstellen, dass wir nur eine Antwort senden:

.exec((err, company) => {
  if (err) {
    res.status(500).json(err);
  } else if (!company) {
    res.status(404).json();         // Only this runs.
  } else {
    res.status(200).json(company);
  }
});

oder indem Sie zurücksenden, wenn die Antwort gesendet wurde:

.exec((err, company) => {
  if (err) {
    return res.status(500).json(err);
  } else if (!company) {
    return res.status(404).json();  // Only this runs.
  }
  return res.status(200).json(company);
});

Ein großer Sünder sind asynchrone Funktionen. Nehmen Sie die Funktion aus this Frage, zum Beispiel:

article.save(function(err, doc1) {
  if (err) {
    res.send(err);
  } else {
    User.findOneAndUpdate({ _id: req.user._id }, { $Push: { article: doc._id } })
    .exec(function(err, doc2) {
      if (err) res.send(err);
      else     res.json(doc2);  // Will be called second.
    })

    res.json(doc1);             // Will be called first.
  }
});

Hier haben wir eine asynchrone Funktion (findOneAndUpdate()) im Codebeispiel. Liegen keine Fehler vor (err) findOneAndUpdate() wird aufgerufen. Da diese Funktion asynchron ist, wird res.json(doc1) sofort aufgerufen. Angenommen, es gibt keine Fehler in findOneAndUpdate(). Die res.json(doc2) in else wird dann aufgerufen. Es wurden nun zwei Antworten gesendet und die Fehlermeldung Header können nicht gesetzt werden tritt auf.

In diesem Fall besteht die Lösung darin, res.json(doc1) zu entfernen. Um beide Dokumente an den Client zurückzusenden, könnte die res.json() im else als res.json({ article: doc1, user: doc2 }) geschrieben werden.

34
MikaS

Viele Leute trafen diesen Fehler. Es ist eine Verwechslung mit asynchroner Verarbeitung. Höchstwahrscheinlich setzt Ihr Code im ersten Häkchen Kopfzeilen ein, und dann führen Sie in einem zukünftigen Tick einen asynchronen Rückruf aus. Dazwischen wird der Antwortheader gesendet, aber dann versuchen weitere Header (wie eine 30X-Umleitung), zusätzliche Header hinzuzufügen. Dies ist jedoch zu spät, da der Antwortheader bereits übertragen wurde.

Ich bin nicht sicher, was genau Ihren Fehler verursacht, aber betrachten Sie alle Rückrufe als mögliche Untersuchungsbereiche.

Ein einfacher Tipp, um Ihren Code zu vereinfachen. Befreien Sie sich von app.configure() und rufen Sie app.use direkt in Ihrem Top-Level-Bereich auf.

Siehe auch das Modul everyauth , das Facebook und ein Dutzend anderer Authentifizierungsanbieter von Drittanbietern ausführt.

32
Peter Lyons

Ich habe meinen Kopf über dieses Problem gekocht und es ist aufgrund eines unvorsichtigen Fehlers beim Umgang mit den Rückrufen geschehen. Bei nicht zurückgegebenen Rückrufen wird die Antwort zweimal festgelegt.!

Mein Programm hatte einen Code, der die Anfrage validiert und die Datenbank abfragt. Nach der Überprüfung, ob ein Fehler vorhanden ist, habe ich die index.js mit den Überprüfungsfehlern zurückgerufen. Und wenn die Validierung erfolgreich ist, wird die Datenbank mit Erfolg/Misserfolg erreicht. 

    var error = validateRequestDetails("create",queryReq);
    if (error)
        callback(error, null);
   else
    some code 
    callback(null, success);

Was passiert ist, ist: Die Incase-Validierung schlägt fehl und der Callback-Aufruf wird aufgerufen, und die Antwort wird festgelegt. Aber nicht zurückgekehrt. So geht es immer noch weiter, die Methode geht an db und trifft Erfolg/Misserfolg. Der gleiche Rückruf wird erneut aufgerufen, sodass die Antwort jetzt zweimal festgelegt wird. 

Die Lösung ist also einfach: Sie müssen den Rückruf "zurückgeben", damit die Methode nach dem Auftreten des Fehlers nicht mehr ausgeführt wird und das Antwortobjekt daher einmal festgelegt wird 

  var error = validateRequestDetails("create",queryReq);
    if (error)
        callback(error, null);
        return;
    else
       some code 
       callback(null, success);
14
randomness

Diese Art von Fehler erhalten Sie, wenn Sie nach dem Senden einer Antwort Anweisungen übergeben.

Zum Beispiel: 

res.send("something response");
console.log("jhgfjhgsdhgfsdf");
console.log("sdgsdfhdgfdhgsdf");
res.send("sopmething response");

Wird zu dem Fehler führen, den Sie sehen, da nach dem Senden der Antwort der folgende res.send nicht ausgeführt wird.

Wenn Sie etwas tun möchten, sollten Sie dies tun, bevor Sie die Antwort senden.

13
Trojan

Manchmal erhalten Sie diese Fehlermeldung, wenn Sie versuchen, die next () - Funktion nach res.end oder res.send aufzurufen. Versuchen Sie zu löschen, wenn Sie next () nach res.send oder res.end haben Ihre Funktion . Hinweis: Hier bedeutet next (), nachdem Sie dem Client mit Ihrer Antwort ( dh res.send oder res.end ) geantwortet haben, dass Sie immer noch versuchen, Code auszuführen, um erneut zu antworten legal.

Beispiel: 

router.get('/',function (req,res,next){
     res.send("request received");
     next(); // this will give you the above exception 
});

entfernen Sie next() von der obigen Funktion und es wird funktionieren.

5

In meinem Fall war es eine 304-Antwort (Caching), die das Problem verursachte. 

Einfachste Lösung:

app.disable('etag');

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/

3
blented

In meinem Fall war dies bei React und postal.js der Fall, wenn ich einen Kanal im componentWillUnmount-Callback meiner React-Komponente nicht kündigte.

3
Zoltán

Lehnte mich nur daran. Sie können die Antworten über diese Funktion weiterleiten:

app.use(function(req,res,next){
  var _send = res.send;
  var sent = false;
  res.send = function(data){
    if(sent) return;
    _send.bind(res)(data);
    sent = true;
};
  next();
});
2
iMad

Für alle, die dies tun, und keine der anderen Lösungen half, in meinem Fall manifestierte sich dies auf einer Route, die das Hochladen von Bildern handhabte, jedoch nicht mittimeoutsumgehen konnte, und ob der Upload zu lange dauerte Zeitüberschreitung, wenn der Rückruf ausgelöst wurde nachdem die Zeitüberschreitungsantwort gesendet wurde, führte der Aufruf von res.send () zum Absturz, da die Header bereits für die Zeitüberschreitung festgelegt waren.

Dies wurde leicht reproduziert, indem ein sehr kurzer Timeout eingestellt und die Route mit einem recht großen Bild erreicht wurde. Der Absturz wurde jedes Mal reproduziert.

2
Mike

Fügen Sie diese Middleware hinzu und es wird funktionieren

app.use(function(req,res,next){
 var _send = res.send;
var sent = false;
res.send = function(data){
    if(sent) return;
    _send.bind(res)(data);
    sent = true;
};
next();
});
2
ASHISH RANJAN

Dies geschieht, wenn die Antwort an den Client übermittelt wurde und Sie erneut versuchen, eine Antwort zu geben. Sie müssen Ihren Code einchecken, dass Sie irgendwo wieder eine Antwort an den Client zurücksenden, die diesen Fehler verursacht. Prüfen Sie die Antwort einmal und senden Sie sie zurück, wenn Sie zurückkehren möchten.

2
Ankit Manchanda

Kam hier aus nuxt , das Problem war in der asyncData-Methode der Komponente, ich vergaß, return zu versprechen, welche Daten abgerufen und dort Header gesetzt wurden.

1
Nick Synev

In TypeScript bestand mein Problem darin, dass die Websocket-Verbindung nach dem Erhalt einer Nachricht nicht geschlossen wurde.

WebSocket.on("message", (data) => {
    receivedMessage = true;
    doSomething(data);
    localSocket.close(); //This close the connection, allowing 
});
0
Janac Meena

Wenn Sie Rückruffunktionen verwenden, verwenden Sie return nach dem Block err. Dies ist eines der Szenarien, in denen dieser Fehler auftreten kann.

userModel.createUser(data, function(err, data) {
    if(err) {
      res.status = 422
      res.json(err)
      return // without this return the error can happen.
    }
    return res.json(data)
  })

Getestet auf Node-Version v10.16.0 und Express 4.16.4

0
Krishnadas PC

Alles was ich im Falle dieses Fehlers tun musste, war res.end ().

 auth.annonymousOnly = function(req, res, next) {
 // add other task here   
   res.end();    
  };

Das andere Problem, mit dem Sie konfrontiert sein könnten, ist der Code nach res.json und res. schreiben. In diesem Fall müssen Sie die Ausführung mit return beenden.

 auth.annonymousOnly = function(req, res, next) {

  if(!req.body.name)
  {
    res.json({error:"some error"});
    return;
  }
  let comp = "value"; // this is the code after res.json which may cause some problems so you have to use return 
};
0
coder

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 eine 500 zurückgeben. Sobald ich das Problem gelöst hatte, war das Problem behoben.

0
Ross Harding

In meinem Fall geschieht dies aufgrund mehrerer Rückrufe. Ich habe next() method während des Codes mehrfach aufgerufen 

0
Mr. Ratnadeep

Bitte überprüfen Sie, ob Ihr Code mehrere res.send () - Anweisungen für eine einzelne Anforderung zurückgibt. Wie wenn ich dieses Problem hatte ....

Ich habe dieses Problem in meiner Anwendung zum Wiederherstellen von Knoten gehabt. 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 Switch ohne Schreibunterbrechung bearbeitet. Für diejenigen, die sich mit Switch Case nicht auskennen, sollte man wissen, dass Schlüsselwörter zurückgegeben werden. Der Code unter case und den nächsten Zeilen wird auf jeden Fall ausgeführt. Auch wenn ich einzelne res.send senden möchte, gab es aufgrund dieses Fehlers mehrere res.send-Anweisungen zurück, die dazu aufforderten 

fehler können nicht gesetzt werden, nachdem sie an den Client gesendet wurden. Was wurde durch das Hinzufügen oder die Verwendung von return vor jeder res.send () -Methode wie return res.send (200) gelöst?

switch (status) { case -1: res.send(400); break; case 0: res.send(200); break; default: res.send(500); break; }

0
KNDheeraj

Es ist sehr wahrscheinlich, dass dies eher eine Knotensache ist. In 99% der Fälle ist es ein doppelter Rückruf, der dazu führt, dass Sie zweimal oder zweimal hintereinander antworten, verdammt sicher. Es wurde mein Problem gelöst, indem next () innerhalb einer Schleife verwendet wurde. Entfernen Sie next () aus der Schleife oder beenden Sie den Aufruf mehr als einmal.

0
Naved Ahmad

Wenn Sie keine Hilfe von oben erhalten: für noobs Der Grund für diesen Fehler ist das mehrmalige Senden einer Anfrage. ` 

module.exports = (req,res,next)=>{
        try{
           const decoded  = jwt.verify(req.body.token,"secret");
           req.userData = decoded;
           next();
        }catch(error){
            return res.status(401).json({message:'Auth failed'});
        }
        next();   
        }

` Wenn Sie next () zweimal aufrufen, wird ein Fehler ausgegeben

  1. 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 ist Antwort zweimal senden, ob Sie bereits eine Antwort gesendet haben

0
Sanjay