我想知道以下代码的行为背后的机制是什么:
res.send(200, { data: 'test data' });
console.log('still here...');
我的理解是res.send
不返回函数,而是关闭连接/结束请求。这可以解释为什么我仍然可以在res.send
命令后执行代码(我查看了快速源,但它似乎不是异步函数)。
还有其他我可能会想念的东西吗?
Answers:
当然可以end
结束HTTP响应,但是它对您的代码没有做任何特殊的事情。
即使您已结束回复,也可以继续做其他事情。
但是,您无法做的是利用进行任何有用的操作res
。由于响应结束,因此您无法向其写入更多数据。
res.send(...);
res.write('more stuff'); // throws an error since res is now closed
此行为与其他传统框架(PHP,ASP等)不同,其他传统框架将线程分配给HTTP请求并在响应结束时终止线程。如果您调用类似ASP的等效函数Response.End
,则线程终止并且您的代码停止运行。在节点中,没有要停止的线程。 req
并且res
不会再触发任何事件,但是回调中的代码可以自由继续运行(只要它不尝试调用res
需要打开有效响应的方法即可)。
编辑:我不再做下面解释的事情,因为当不需要它时,您不应该返回一个值。它使您的代码可读性较差,看起来有些黑。相反,我建议将return语句与分开res.send()
。@slavafomin在评论中对此进行了很好的解释。
停止执行功能并同时发送响应的一种简单方法是
return res.send('500', 'Error message here');
这使您可以使用简短if
语句来处理以下错误:
if (err) {
return res.send('500', 'Error message here');
}
确切的返回的的res.send
函数是一个对象是似乎包含了连接的整个状态,你结束之后(请求,状态,标题等),但是这应该是不重要的,因为你不会做任何事的。
res.send('500', 'Error message here');return;
内部if
声明。
send
它时,只需将数据通过HTTP连接传输出去,代码便会继续。您可以使用return
要终止的代码,也可以不编写其他任何代码。对不起,造成误解。