Node.js中返回req.on语句修复HTTP服务bug的原因是什么?
问题原因解析
你在req.on('end')前加return的核心作用是终止当前请求处理函数的后续代码执行,这是Node.js异步编程的典型场景:
req.on('end', callback)属于异步事件注册逻辑,它只是给请求对象绑定了一个「请求体完全接收后触发」的回调函数,不会同步等待这个回调执行完成,就会继续向下运行后续代码。
不加return时的执行流程
- 请求匹配到
url === '/message' && method === 'POST'分支 - 注册
data事件回调,用来收集请求体的分片数据 - 注册
end事件回调,预留后续处理完整请求体、写文件、跳转的逻辑 - 因为没有return终止函数执行,代码会直接跳出if分支,运行最后面的默认响应逻辑:
res.setHeader('Content-Type', 'text/html'); res.write('<html>'); res.write('<head><title> My First Page </title></head>'); res.write('<body><h1> Hello </h1></html>'); res.write('</html>'); res.end(); - 此时响应已经被
res.end()发送给客户端,后续请求体接收完成触发end事件时,再尝试修改状态码、设置跳转头、再次调用res.end()都会失效,甚至抛出「响应已被发送」的报错,自然无法正常运行。
补充说明:这里return的返回值本身没有实际意义,我们只是利用函数return会终止后续代码执行的特性,避免默认响应逻辑提前把响应结束掉。
内容的提问来源于stack exchange,提问作者Liron Naccache
相关产品推荐
相关产品推荐

