You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 02:32:50