为什么我可以在“res.send”之后执行代码?
我想知道下面的代码行为背后的机制是什么:
res.send(200, { data: 'test data' }); console.log('still here...');
我的理解是res.send
不会返回函数,但会closures连接/结束请求 。 这可以解释为什么我仍然可以执行res.send
命令后执行代码(我通过快速查看源代码,它似乎不是一个asynchronous函数)。
还有其他什么东西可以丢失吗?
当然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
不会触发任何更多的事件,但是callback中的代码可以自由地继续运行(只要它不尝试调用需要有效响应打开的res
方法)。
编辑:我不再做什么下面解释,因为你不应该返回一个值时,没有必要的。 它使得你的代码不易读,看起来很骇人听闻。 相反,我build议从res.send()
分离出return语句。 @slavafomin在评论中解释了这一点。
停止执行函数并同时发送响应的一个简单方法就是这样做
return res.send('500', 'Error message here');
这允许您使用短if
语句来处理错误,如:
if (err) { return res.send('500', 'Error message here'); }
res.send
函数的确切返回值是一个对象 , 在你结束之后 (请求,状态,头文件等等) 似乎包含了连接的整个状态 ,但这应该是不重要的,因为你不会做任何事情用它。