为什么我可以在"res.send"之后执行代码?

Leo*_*das 67 node.js express

我想知道以下代码的行为背后的机制是什么:

res.send(200, { data: 'test data' });
console.log('still here...');
Run Code Online (Sandbox Code Playgroud)

我的理解是res.send返回函数,而是关闭连接/结束请求.这可以解释为什么我仍然可以在res.send命令后执行代码(我查看了快速源代码并且它似乎不是异步函数).

还有什么其他的东西可以让我失踪吗?

jos*_*736 102

当然会end结束HTTP响应,但它不会对您的代码执行任何特殊操作.

即使您已经结束回复,也可以继续做其他事情.

然而,你不能做的是做任何有用的事情res.由于响应结束,您无法向其写入更多数据.

res.send(...);
res.write('more stuff'); // throws an error since res is now closed
Run Code Online (Sandbox Code Playgroud)

此行为与其他传统框架(PHP,ASP等)不同,后者将线程分配给HTTP请求并在响应结束时终止线程.如果你调用ASP之类的等效函数Response.End,则线程终止并且代码停止运行.在节点中,没有要停止的线程. req并且res不会再触发任何事件,但回调中的代码可以自由继续运行(只要它不会尝试调用res需要打开有效响应的方法).

  • @jkatzer意识形态很弱.实用主义胜利. (22认同)
  • @jkatzer - 你的陈述完全是愚蠢的,并说明了一种有毒的心态. (10认同)
  • 这个答案非常有用,并且说服我出于意识形态的原因离开了nodejs. (7认同)
  • 当然,试着记住Node只是一个执行环境,如果你使用的是expressjs,这就是你的web服务器.你所说的就像想知道为什么Apache在php返回响应后继续运行.你可以选择使用这个额外的容量,也许你想在发送后记录响应的状态,或者做一些其他的应用程序功能,它取决于你.然而,凭借强大的力量,责任重大...... (6认同)
  • @OscarVGG:`return`? (5认同)
  • @AnatolyG 我在阅读此评论部分时至少阅读了您的评论 5 次,每次我都读到它是抄袭,并嘲笑它,现在是嘲笑我自己。哈哈。 (2认同)

Mar*_*ira 39

编辑:我不再执行下面解释的操作,因为在不需要时不应返回值.它使您的代码可读性降低,看起来很乱.相反,我建议将return语句与res.send().@slavafomin在评论中对此做了很好的解释.

一种停止执行函数并同时发送响应的简单方法就是这样做

return res.send('500', 'Error message here');
Run Code Online (Sandbox Code Playgroud)

这允许您使用简短if语句来处理错误,例如:

if (err) {
    return res.send('500', 'Error message here');
}
Run Code Online (Sandbox Code Playgroud)

确切的返回的的res.send函数是一个对象似乎包含了连接的整个状态,你结束之后(请求,状态,标题等),但是这应该是不重要的,因为你不会做任何事的.

  • 是的,当时我无法评论,所以我不得不发一个答案. (3认同)
  • 我建议不要使用这种技术.它使代码更短,但它也使它没有意义和模糊,因为它使用不正确的语义.如果您没有使用函数中的值,那么您不应该返回一个.它还可以使用静态代码分析打破类型化的JavaScript(如TypeScript)和工具.换句话说:它看起来很乱,而且不专业. (3认同)
  • 这是一个很好的观点,但技术上并不是答案.因为问题更多的是为什么而不是如何.尽管如此,贡献很大,因此upvote :). (2认同)
  • 如果您担心返回未使用的值,可以使用 `void` 关键字:`return void res.send('500', 'Error message here');`。这将确保函数返回“undefined”。 (2认同)