如何结束express.js / node POST响应?
我试图在我将文档保存到数据库之后停止发布请求,即:
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();
但是发送客户端到一个空白页面…
提前致谢。
编辑:
我不认为我在自己的对不起有什么了不起,
也许它的坏习惯,但这是发生了什么事情:
-
POST启动数据库保存function
-
浏览器坐在等待响应
-
当它准备好了,obj被保存到数据库,然后callback触发一个NowJS函数,该函数将该项添加到视图(对于每个人)
我这样做是非阻塞的(所以我认为)
您可以使用res.end
并传入要发送到客户端的string:
res.end('It worked!');
或者,您可以渲染一个视图 ,然后结束响应:
res.render('blah.jade'); res.end();
总而言之,redirect客户实际上是最佳实践。 这使得当他们在浏览器中点击后退button时,他们可以无缝地返回,而不需要任何“需要POST”popup窗口或类似的东西。 这是POST /redirect模式,你可以在http://en.wikipedia.org/wiki/Post/Redirect/Get上阅读更多。
虽然您可以使用从Node的http模块借用的底层方法,但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; };
为了将来的参考,你也可以这样做:
res.redirect('back');
基本上这只是将浏览器redirect到请求来自的屏幕,换句话说就是“刷新”它。 这是哈克,我希望有一个更好的办法,但它的作品。
如果你可以通过AJAX修改你的客户端代码来发布请求,你可以直接使用res.end()。
这里的问题是,当浏览器发出一个POST请求(不是通过AJAX),它不再关心当前页面。 它期待一个新的页面,所以它会加载一个新的页面。 这纯粹是浏览器,我不相信目前有办法解决这个问题。
总体而言,如果可以的话,您应该只使用AJAX POST请求。
客户端浏览器正在等待响应。 那么为什么不给它一个像res.send('<p>Thank you</p>');
或一个不错的渲染视图?
res.end()
将客户端发送到空白页面的原因是您没有给客户端显示任何内容。
结束快速路由而无需路由到新页面或者任何乱七八糟的expression要求您不要停留在当前页面上的最佳方式,尽pipe您有自己的理由是使用window.stop,例如窗体,您使用javascript来处理提交,超时应足以保证数据以POST方式发送。
document.myform.mysubmit.click() setTimeout(function(){ window.stop() }, 3000);