为什么在“ res.send”之后执行代码?


78

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

res.send(200, { data: 'test data' });
console.log('still here...');

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

还有其他我可能会想念的东西吗?


抱歉,我读错了您的帖子,并且不确定您的代码是什么问题,因为它完全合法。当您调用send它时,只需将数据通过HTTP连接传输出去,代码便会继续。您可以使用return要终止的代码,也可以不编写其他任何代码。对不起,造成误解。
Timmerz

Answers:


122

当然可以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需要打开有效响应的方法即可)。


7
这个答案非常有帮助,并且出于意识形态的原因使我说服了我离开nodejs。
jkatzer 2014年

31
@jkatzer意识形态薄弱。实用主义胜出。
Anatoly G

8
当然,请记住,Node只是一个执行环境,如果您使用expressjs,则这是您的Web服务器。您的意思是想知道为什么php返回响应后Apache仍继续运行。您可以选择使用此额外的容量,也许要在发送响应后记录其状态,或者执行其他一些应用程序功能,具体取决于您。但是,强大的力量将带来巨大的责任……
samazi

11
@jkatzer-您的陈述完全是疯狂的,说明了一种有害的心态。
Dembinski

1
@AnatolyG在阅读此评论部分时,我至少读了5次您的评论,并且每次都阅读窃,并在嘲笑,现在是对我自己。大声笑。
Lalit Fauzdar

44

编辑:我不再做下面解释的事情,因为当不需要它时,您不应该返回一个值。它使您的代码可读性较差,看起来有些黑。相反,我建议将return语句与分开res.send()。@slavafomin在评论中对此进行了很好的解释。

停止执行功能并同时发送响应的一种简单方法是

return res.send('500', 'Error message here');

这使您可以使用简短if语句来处理以下错误:

if (err) {
    return res.send('500', 'Error message here');
}

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


2
这是一个好点,但从技术上来说并不是答案。因为问题更多的是为什么而不是如何。尽管如此,贡献很大,所以赞成:)。
Nepoxx 2014年

3
是的,当时我无法发表评论,所以我不得不发表答案。
Marcos Pereira 2014年

4
我建议不要使用这种技术。它使代码更短,但也使其含义和含糊不清,从而导致使用不正确的语义。如果您没有使用函数中的值,则不应返回一个。它还可能使用静态代码分析破坏类型化的JavaScript(如TypeScript)和工具。换句话说:它看起来有点笨拙且不专业。
Slava Fomin II

1
@SlavaFominII可以像这样:res.send('500', 'Error message here');return;内部if声明。
阿里·谢拉菲特

@SlavaFominll我认为这种方法是如此普遍,以至于不能再将其称为黑派了。至于静态分析器-由于快递开发人员是负责处理此函数返回值的人员,因此,我敢肯定没有什么好担心的。您遇到特定问题了吗?
Ohad Cohen
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.