【问题标题】:Node Js Cannot set headers after they are sent to the clientNode Js发送到客户端后无法设置标头
【发布时间】:2021-08-15 09:49:45
【问题描述】:

你好 StackOverFlow 军队, 我得到了

标头发送到客户端后无法设置

此代码中有错误。

getUserInfo: async (req, res) => {
    try {
      const { id } = req.user;
      
      // Check is User Data present in Redis
      redis_client.GET("USER_" + id, (err, user) => {
        if (err) {
          console.log(err.message);
          return res.status(500).json({ msg: "Server Error!" });
        }

        // If present Return User data
        // Return User data
        user = JSON.parse(user);
        if (user) return res.json({ user });
      });

      // Else Fetch Data from Database
      const user = await Users.findById(id).select("-password");

      // Set to Redis
      redis_client.SET(
        "USER_" + id.toString(),
        JSON.stringify(user),
        "EX",
        10,
        (err, reply) => {
          if (err) {
            console.log(err.message);
            return res.status(500).json({ msg: "Server Error!" });
          }
        }
      );

      // Return User data
      res.json({ user });
    } catch (error) {
      return res.status(500).json({ msg: error.message }); // Line 77
    }
  },

第 77 行出错。

请帮帮我,我不明白为什么会这样。我正在发送响应,并且发送响应之间没有冲突。将用户数据存储在 redis 中以便更快地获取是否是一种好习惯。 到期时间非常短,例如 10 秒,因此如果用户垃圾邮件刷新,它将有助于更快地获取。任何建议表示赞赏。

【问题讨论】:

  • 将所有回调函数转换为返回 Promise 的新函数。

标签: node.js mongodb express redis try-catch


【解决方案1】:

你需要把你的 else 部分放在 redis_client.GET 的回调函数中,就在这一行下面

**if (user) return res.json({ user });

现在发生的情况是,如果上面的 if 条件为 true ,那么代码也将移动到下一行,因为 return 语句只会从回调函数返回,而不是结束响应周期。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多