Axios请求出现Cannot set headers after they are sent to the client错误如何解决?
错误产生原因
- 核心触发逻辑:HTTP协议规定单次请求只能对应一次响应,Express 中调用
res.json()/res.send()等方法后,就会向客户端发送响应头和响应体,结束本次请求的响应流程,不允许再次修改响应头或发送新的响应内容。 - 代码问题:
getuser接口函数开头就执行了res.status(200).json("hello from code with himanhsu 12315464968 darling"),已经完成响应发送,后续try块中查询用户数据后的res.json(user)、catch块中的报错返回res.json({ message: error.message })都属于尝试第二次发送响应,直接触发Cannot set headers after they are sent to the client报错。 - 附带的
UnhandledPromiseRejectionWarning警告是因为第一次响应发送后,后续数据库查询如果抛出异常,catch块尝试再次发送响应失败抛出的新错误没有被捕获,形成未处理的Promise拒绝。
修复方案
你只需要删除/注释掉接口开头多余的测试响应代码即可,修复后代码如下:
import User from "../model/UserSchema.js" export const getuser = async (req, res) => { // 移除开头多余的响应发送逻辑 // res.status(200).json("hello from code with himanhsu 12315464968 darling") try { let user = await User.find() res.status(200).json(user) } catch (error) { res.status(500).json({ message: error.message }) } }
如果你需要保留测试内容临时返回,只需在测试响应代码后加return终止后续逻辑执行即可:
res.status(200).json("hello from code with himanhsu 12315464968 darling") return // 终止后续代码运行,不会触发二次响应
你的前端Axios请求代码没有问题,无需修改。
内容的提问来源于stack exchange,提问作者HIMANSHU KUMAR AMB
相关产品推荐
相关产品推荐

