webentwicklung-frage-antwort-db.com.de

So beenden Sie einen express.js/node POST Antwort?

Ich versuche die Post-Anfrage einfach zu stoppen, nachdem ich ein Dokument in der Datenbank gespeichert habe.

app.post('/blah'), function(req,res){ 
//my code does a bunch of stuff

res.what do i put here to tell the client browser to just... stop the POST
}

Im Moment benutze ich einfach res.redirect('back'), was funktioniert, aber die Seitenaktualisierung ist völlig willkürlich und ich würde es vorziehen, wenn es nicht passiert. Ich hatte einen Versuch bei res.end();, aber das sendet den Client auf eine leere Seite ...

Danke im Voraus.

edit:

Ich glaube nicht, dass ich mir klar genug gemacht habe, was ich leid tue.

Vielleicht ist es eine schlechte Praxis, aber das ist, was passiert:

  1. Der POST initiiert die Datenbankspeicherfunktion

  2. Der Browser sitzt herum und wartet auf eine Antwort

  3. Wenn es gut und fertig ist, wird das Objekt in der DB gespeichert. Dann löst ein Callback die Funktion NowJS aus, die das Element zur Ansicht hinzufügt (für alle).

Ich habe es so gemacht, um nicht blockierend zu sein (dachte ich)

35
Andrew Plummer

Sie können res.end verwenden und eine Zeichenfolge übergeben, die an den Client gesendet werden soll:

res.end('It worked!');

Alternativ können Sie eine Ansicht rendern und dann die Antwort beenden:

res.render('blah.jade');
res.end();

Alles in allem ist das Umleiten des Clients die beste Vorgehensweise. Wenn Sie auf die Zurück-Schaltfläche in Ihrem Browser klicken, können Sie sich nahtlos zurückbewegen, ohne Popup-Fenster oder ähnliches zu erhalten. Dies ist das POST/Redirect-Muster, das Sie unter http://en.wikipedia.org/wiki/Post/Redirect/Get nachlesen können.

46
Rohan Singh

Zur späteren Verwendung können Sie auch Folgendes tun:

res.redirect('back');

Im Grunde führt dies den Browser nur zu dem Bildschirm zurück, von dem die Anfrage stammt, dh "erfrischt" ihn. Es ist hackig und ich wünschte, es gäbe einen besseren Weg, aber es funktioniert.

3
jeremytripp

Während Sie die zugrunde liegende end-Methode verwenden können, die aus dem http-Modul von Node entlehnt wurde, verfügt Express.js über eine eigene send-Methode, die gegebenenfalls end aufruft:

/**
 * Send a response.
 *
 * Examples:
 *
 *     res.send(new Buffer('wahoo'));
 *     res.send({ some: 'json' });
 *     res.send('<p>some html</p>');
 *     res.send(404, 'Sorry, cant find that');
 *     res.send(404);
 *
 * @param {Mixed} body or status
 * @param {Mixed} body
 * @return {ServerResponse}
 * @api public
 */
res.send = function(body){
  .
  .
  .

  // respond
  this.end(head ? null : body);
  return this;
};
3
Behrang

Wenn Sie Ihren clientseitigen Code ändern können, um die Post-Anfrage über AJAX zu stellen, können Sie einfach res.end () verwenden. 

Das Problem hierbei ist, dass wenn der Browser eine POST -Anforderung (nicht über AJAX) abfragt, die aktuelle Seite nicht mehr beachtet wird. Es erwartet eine neue Seite und lädt daher eine neue Seite. Dies ist nur beim Browser der Fall, und ich glaube nicht, dass es derzeit eine Möglichkeit für Sie gibt, dies zu umgehen.

Generell sollten Sie einfach eine AJAX POST - Anfrage verwenden, wenn Sie können.

2
Nick Mitchinson

Verwenden Sie -> res.status (204) .send (); in der Post-Anfrage 

if(err) {

   console.log(err);

} else {

   res.status(204).send();

}
0
Muhammed karim

Der Client-Browser wartet auf eine Antwort. Warum also nicht eine mit etwas wie res.send('<p>Thank you</p>'); oder einer Nizza gerenderten Ansicht?

Der Grund, warum res.end() den Client auf eine leere Seite schickt, ist, dass Sie dem Client nichts zur Anzeige geben.

0
Colin Ross

Der beste Weg, das Express-Routing zu beenden, ohne auf eine neue Seite zu routen, oder was auch immer der Chaos-Express bedeutet, dass Sie nicht auf der aktuellen Seite bleiben möchten, obwohl Sie einen eigenen Grund dafür haben, ist window.stop, beispielsweise ein Formular, zu dem Sie Javascript verwenden Um die Übergabe zu bearbeiten, sollte das Timeout ausreichen, um sicherzustellen, dass die Daten als POST -Methode gesendet werden.

document.myform.mysubmit.click()
    setTimeout(function(){ 
        window.stop() 
    }, 3000);
0
syarul