为何调用getList接口时出现Cannot set headers after they are sent to the client错误?
解决"Cannot set headers after they are sent to the client"错误
这个错误的核心原因是同一请求被多次发送响应。你的代码里,当用户不存在或列表不存在时,虽然发送了错误响应,但没有终止函数执行,导致后续的成功响应代码依然会运行,重复设置响应头触发报错。Postman测试时可能因为响应顺序或特性没暴露问题,但客户端会正常触发这个错误。
修改方案:
在每个错误响应后添加return终止函数执行,同时修复catch块里的变量名错误:
const getList = asyncHandler(async (req, res) => { const { userId, name } = req.body; try { const user = await User.findById(userId).populate({ path: 'lists', populate: { path: 'books' }, }); // 用户不存在时返回错误并终止 if (!user) { return res.status(400).json({ error: "User doesn't exist" }); } let list = user.lists.find((list) => list.listName === name); // 列表不存在时返回错误并终止 if (!list) { return res.status(400).json({ error: 'List does not exist' }); } // 正常返回列表 res.status(200).json(list); } catch (err) { // 修复变量名错误,同时返回500响应避免请求挂起 console.log(err); res.status(500).json({ error: 'Server error' }); } });
关键修改点:
- 每个
res.status().json()前加return,确保发送错误响应后不再执行后续代码 - 把catch块里的
console.log(error)改成console.log(err),匹配catch的参数名 - 新增500状态的错误响应,避免客户端因服务器未返回响应而一直等待
内容的提问来源于stack exchange,提问作者medOnline5
相关产品推荐
相关产品推荐

