为什么我可以在“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等效函数,线程将终止,代码将停止运行。 在节点中,没有线程停止。 reqres不会触发任何更多的事件,但是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函数的确切返回值是一个对象在你结束之后 (请求,状态,头文件等等) 似乎包含了连接的整个状态 ,但这应该是不重要的,因为你不会做任何事情用它。