Express调用res.status(404).json后仍执行后续代码,原因何在?
问题原因及解决方案
在Express中,res.status().json()这类响应方法仅负责向客户端发送HTTP响应,但不会自动终止当前请求处理函数的执行流程。也就是说,调用完该方法后,函数内后续的代码(比如你写的console.log)依然会正常执行。
哪怕是在serverless-http搭配AWS Lambda的环境下,这个行为也和标准Express一致——Lambda函数会执行到代码逻辑的末尾,不会因为发送了响应就提前退出。
要解决这个问题,你需要在发送响应后手动终止代码执行,常用方式有两种:
在
res.status().json()后添加return语句,直接结束当前函数:res.status(404).json({ error: `Usuario ${userId} no encontrado`, _uuid: req._uuid }); return; // 终止后续代码执行 console.log("No se encontró nada < End "); // 这行代码不会再执行若在异步函数中,也可以直接返回响应对象,效果相同:
return res.status(404).json({ error: `Usuario ${userId} no encontrado`, _uuid: req._uuid }); console.log("No se encontró nada < End "); // 这行代码不会再执行
另外需要注意:在AWS Lambda环境下,即便你不手动终止,Lambda也会在事件循环为空时结束执行,但这并不影响同步代码的执行——你的console.log属于同步代码,必然会在Lambda结束前运行完毕。所以手动添加return是最直接的解决办法。
内容的提问来源于stack exchange,提问作者victor zubiaga
相关产品推荐
相关产品推荐

