web-dev-qa-db-fra.com

Comment mettre fin à un fichier express.js/node POST réponse?

J'essaie simplement d'arrêter la demande de publication après avoir enregistré un document dans la base de données, par exemple:

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
}

Pour le moment, j'utilise simplement res.redirect('back'), ce qui fonctionne, mais l'actualisation de la page est totalement arbitraire et je préférerais que cela ne se produise pas. J'ai eu un essai à res.end(); mais cela envoie le client à une page blanche ...

Merci d'avance.

modifier:

Je ne pense pas que je sois assez clair dans ce que je fais désolé.

C'est peut-être une mauvaise pratique, mais c'est ce qui se passe:

  1. Le POST lance la fonction de sauvegarde de la base de données

  2. Le navigateur est assis en attente d'une réponse

  3. Quand il est prêt, l’obj est enregistré dans la base de données, puis un rappel déclenche une fonction NowJS, qui ajoute cet élément à la vue (pour tout le monde).

Je l'ai fait cette façon d'être non bloquant (donc je pensais)

35
Andrew Plummer

Vous pouvez utiliser res.end et transmettre une chaîne que vous souhaitez envoyer au client:

res.end('It worked!');

Vous pouvez également rendre une vue puis terminer la réponse:

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

Cela dit, la meilleure solution consiste à rediriger le client. Cela fait en sorte que, lorsqu'ils appuient sur le bouton de retour dans leur navigateur, ils puissent revenir en arrière de manière transparente sans obtenir de popup "POST requis" ou autre. Ceci est le modèle POST/redirect et vous pouvez en savoir plus à ce sujet sur http://en.wikipedia.org/wiki/Post/Redirect/Get .

46
Rohan Singh

Pour référence future, vous pouvez également faire:

res.redirect('back');

En gros, cela redirige simplement le navigateur vers l'écran d'où provient la requête, autrement dit, "l'actualise". C'est hacky et j'aimerais qu'il y ait un meilleur moyen, mais ça marche.

3
jeremytripp

Bien que vous puissiez utiliser la méthode end sous-jacente empruntée au module http du nœud, Node.js a sa propre méthode send qui appelle end le cas échéant:

/**
 * 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

Si vous pouviez modifier votre code côté client pour effectuer la demande de publication via AJAX, vous pourriez simplement utiliser res.end (). 

Le problème ici est que lorsque le navigateur fait une demande POST (pas via AJAX), il ne se soucie plus de la page en cours. Il attend une nouvelle page, donc il va charger une nouvelle page. C’est purement avec le navigateur, et je ne crois pas qu’il existe actuellement un moyen de contourner le problème.

Globalement, vous devriez simplement utiliser une requête AJAX POST si vous le pouvez.

2
Nick Mitchinson

Utilisez -> res.status (204) .send (); dans la demande de poste 

if(err) {

   console.log(err);

} else {

   res.status(204).send();

}
0
Muhammed karim

Le navigateur client attend une réponse. Alors pourquoi ne pas lui en donner une avec quelque chose comme res.send('<p>Thank you</p>'); ou une vue rendue agréable?

La raison pour laquelle res.end() envoie le client à une page vierge est que vous ne lui donnez rien à afficher.

0
Colin Ross

La meilleure façon de mettre fin à l'acheminement express sans acheminer vers une nouvelle page ou tout ce que le mess express souhaite ne pas conserver sur la page en cours bien que vous ayez votre propre raison est d'utiliser window.stop, par exemple un formulaire, avec javascript gérer la soumission, le délai d'attente doit être suffisant pour garantir que les données sont envoyées en tant que méthode POST.

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