Node.js Express中ERR_HTTP_HEADERS_SENT错误:是否与async函数有关?
Express路由报错ERR_HTTP_HEADERS_SENT的原因及修复
这个错误不是async函数导致的,问题出在你处理响应的写法上:
错误根源
你在多处用了res.sendStatus(401).send(...)这种写法——sendStatus()方法会直接发送对应的HTTP状态码、默认响应体,并且结束整个响应流程。之后再调用.send(),就会试图再次修改响应头或发送内容,触发“重复发送响应”的错误。
修复方法
把所有res.sendStatus(xxx).send(...)改成以下二选一的写法:
- 如果需要自定义响应体,用
res.status(401).send({message: "unauthenticated"}) - 如果不需要响应体,直接用
res.sendStatus(401)
另外补充一个小优化:userf.toJSON()是同步方法,不需要加await,去掉即可。
修正后的完整代码:
router.get("/user", async (req, res) => { console.log("user hit") try { const cook = req.cookies["jwt"] if(cook == null){ return res.status(401).send({ message: "unauthenticated" }) } const claims = jwt.verify(cook, "secret") if (!claims) { return res.status(401).send({ message: "unauthenticated" }) }; const userf = await LoginCred.findOne({ _id: claims._id }); const { password, ...data } = userf.toJSON(); return res.send(data) } catch (err) { console.log(err) return res.status(401).send({ message: "unauthenticated" }); } })
内容的提问来源于stack exchange,提问作者LIKO
相关产品推荐
相关产品推荐

