Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 为什么我可以在“后”执行代码;res.send";?_Node.js_Express - Fatal编程技术网

Node.js 为什么我可以在“后”执行代码;res.send";?

Node.js 为什么我可以在“后”执行代码;res.send";?,node.js,express,Node.js,Express,我想知道以下代码行为背后的机制是什么: res.send(200, { data: 'test data' }); console.log('still here...'); 我的理解是,res.send不会返回函数,但会关闭连接/结束请求。这可以解释为什么我仍然可以在执行res.send命令后执行代码(我查看了express源代码,它似乎不是一个异步函数) 还有什么我可能遗漏的吗?当然end会结束HTTP响应,但它对代码没有任何特殊作用 你可以继续做其他事情,即使你已经结束了回应 但是,您不

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

res.send(200, { data: 'test data' });
console.log('still here...');
我的理解是,
res.send
不会返回函数,但会关闭连接/结束请求。这可以解释为什么我仍然可以在执行
res.send
命令后执行代码(我查看了express源代码,它似乎不是一个异步函数)


还有什么我可能遗漏的吗?

当然
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()
分开@斯拉瓦福明在评论中对此做了很好的解释

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

return res.send('500', 'Error message here');
这允许您使用简短的
if
语句来处理以下错误:

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

res.send
函数的精确返回是一个对象,它似乎包含了您结束连接后的整个连接状态(请求、状态、标题等),但这并不重要,因为您不会对它做任何操作。

一个可能的解决方案是使用此库:

也适用于Express,例如:

const express = require('express');
const app = express();

app.get('/video', (req, res) => {
 const ffmpeg = spawn(ffmpegPath, argsArray);
 ffmpeg.stdout.pipe(res);
 onFinished(res, () => {
   ffmpeg.kill();
 });
});

对不起,我误读了你的帖子,不确定你的代码有什么问题,因为它是完全合法的。当您调用
send
时,它只是将数据从http连接中导出,您的代码将继续。如果要终止代码,或者不写任何其他内容,可以使用
return
。很抱歉误解了。这个答案非常有用,说服我出于意识形态的原因离开nodejs。@jkatzer的意识形态很弱。实用主义获胜。当然,请记住节点只是一个执行环境,如果您使用的是expressjs,这就是您的web服务器。您所说的就像是想知道为什么在php返回响应后Apache仍在运行。您可以选择使用这个额外的容量,或者您希望在发送响应后记录响应的状态,或者执行一些其他应用程序功能,这取决于您自己。然而,强大的力量带来巨大的责任…@jkatzer-你的陈述完全是空洞的,说明了一种有毒的心态。@Anatolig在阅读这篇评论时,我读了你的评论至少5次,每次都是剽窃,我都在笑,现在是在笑我自己。哈哈。这是一个很好的观点,但从技术上来说,不是答案,。因为问题更多的是为什么而不是如何。尽管如此,还是做出了巨大的贡献,因此投票结果是:)。是的,当时我无法发表评论,所以我不得不发布一个答案。我建议不要使用这种技巧。它使代码更短,但也降低了它的意义和模糊性,因为它使用了不正确的语义。如果未使用函数中的值,则不应返回值。它还可以破坏类型化JavaScript(如TypeScript)和使用静态代码分析的工具。换言之:它看起来很粗俗和不专业。@slavafomini它可以是这样:
res.send('500','Error message here');返回
if
语句中。@SlavaFominll我认为这种方法非常普遍,你不能再称它为hackish了。至于静态分析器——因为express开发人员是处理这个函数返回的人,所以我很确定没有什么好担心的。您是否遇到了特定的问题?
const express = require('express');
const app = express();

app.get('/video', (req, res) => {
 const ffmpeg = spawn(ffmpegPath, argsArray);
 ffmpeg.stdout.pipe(res);
 onFinished(res, () => {
   ffmpeg.kill();
 });
});