如何结束express.js / node POST响应?

时间:2012-02-02 04:35:46

标签: node.js express

我尝试在将文档保存到数据库后停止发布请求,即:

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
}

目前我只是简单地使用res.redirect('back'),但页面刷新是完全随意的,我宁愿它没有发生。我去了res.end();,但是将客户端发送到空白页面......

提前致谢。

编辑:

我不认为我对自己的抱歉做了很清楚。

也许这是一种不好的做法,但这是发生的事情:

  1. POST启动数据库保存功能

  2. 浏览器等待回复

  3. 当好的准备就绪时,obj会保存到数据库中,然后回调会触发 NowJS 函数,该函数会将项目添加到视图中(适用于所有人)

  4. 我这样做是非阻塞的(所以我想)

7 个答案:

答案 0 :(得分:47)

您可以使用res.end并传入要发送给客户的字符串:

res.end('It worked!');

或者,您可以render a view然后结束回复:

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

所有这一切,重定向客户端实际上是最佳做法。它使得当他们在浏览器中点击后退按钮时,他们可以无缝地向后移动而不需要任何“需要POST”弹出窗口等。这是POST /重定向模式,您可以在http://en.wikipedia.org/wiki/Post/Redirect/Get了解更多信息。

答案 1 :(得分:3)

虽然您可以使用从Node的http模块借用的基础end方法,但Express.js有自己的send方法,在适当时调用end

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

答案 2 :(得分:3)

为了将来参考,您还可以:

res.redirect('back');

基本上,这只是将浏览器重定向回请求来自的屏幕,换句话说,#34;刷新&#34;它。它是hacky,我希望有更好的方法,但它确实有效。

答案 3 :(得分:2)

如果你可以修改你的客户端代码以通过AJAX发出帖子请求,你可以简单地使用res.end()。

这里的问题是当浏览器发出POST请求(而不是通过AJAX)时,它不再关心当前页面。它期待一个新页面,因此它将加载一个新页面。这纯粹是使用浏览器,我不相信目前有办法让你解决它。

总的来说,如果可以的话,你应该只使用AJAX POST请求。

答案 4 :(得分:1)

使用-> res.status(204).send();在帖子请求中

if(err) {

   console.log(err);

} else {

   res.status(204).send();

}

答案 5 :(得分:0)

客户端浏览器正在等待响应。那么为什么不给它一个像res.send('<p>Thank you</p>');或一个很好的渲染视图呢?

res.end()将客户端发送到空白页面的原因是您没有向客户端提供任何显示内容。

答案 6 :(得分:0)

在没有路由到新页面的情况下结束快速路由的最佳方法,或者尽管你有自己的理由,但是如果你有自己的理由,你最好不要留在当前页面上是使用window.stop,例如表单,你使用javascript来处理提交,超时应该足以确保数据以POST方式发送。

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