ExpressJS 无效MongoDB ID重定向时报ERR_HTTP_HEADERS_SENT错误如何解决
问题原因
res.redirect()、res.render()、res.end()这类Express响应方法仅负责向客户端返回响应,不会自动中断当前路由函数的执行。你调用重定向方法后没有终止函数运行,后续逻辑会继续尝试操作响应对象,就会触发Error [ERR_HTTP_HEADERS_SENT]报错。
修复方案
在所有发送响应的语句前加return,直接终止函数后续代码执行即可,同时可以删掉冗余的res.end()调用,res.redirect()本身已经会自动结束响应。
修改后的完整代码如下:
router.get("/:id", async (req, res) => { if (!mongoose.isValidObjectId(req.params.id)) { console.log("Test1") return res.redirect("/") } console.log("Test2") try { console.log("Test3") const post = await Post.findById(req.params.id) if (post == null) { return res.redirect("/") } res.render("posts/show", { post: post }) } catch { console.log("Test4") return res.redirect("posts/index") } })
补充说明
- 所有需要提前结束路由逻辑的响应场景(重定向、返回错误、返回数据等)都可以用
return终止函数执行,避免后续逻辑重复操作响应对象。 - 如果有多条分支逻辑,确保每条分支的响应语句都正确添加
return,避免遗漏。
内容的提问来源于stack exchange,提问作者OnionMan1934
相关产品推荐
相关产品推荐

