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();
});
});