👓

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent

2023/02/04に公開

複数のリクエストを送信している。

このエラーが発生するときは、同じリクエストに対して複数回のレスポンスを送信している。そのため、1回のリクエストに対して1回だけレスポンスを返すようにして下さい。

僕のミス

usernameが見つからなかった場合に返すレスポンスに対してreturnをつけ忘れていました。それにより、複数のレスポンスがクライアント側に渡っていました。

exports.login = async (req, res) => {
  const { username, password } = req.body;
  try {
    const user = await User.findOne({ username: username });
    if (!user) {
-      res.status(401).json
+      return res.status(401).json({
        errors: [
          {
            param: "username",
            msg: "ユーザー名が無効です。",
          },
        ],
      });
    }

    //verify passwords.
    const descryptedPassword = CryptoJS.AES.decrypt(
      user.password,
      process.env.SECRET_KEY
    ).toString(CryptoJS.enc.Utf8);
    if (descryptedPassword !== password) {
      return res.status(401).json({
        errors: [
          {
            param: "password",
            msg: "パスワードが無効です。",
          },
        ],
      });
    }

    //published JWT
    const token = jsonwebtoken.sign(
      { id: user._id },
      process.env.TOKEN_SECRET_KEY,
      {
        expiresIn: "24h",
      }
    );

    res.status(201).json({ user, token });
  } catch (err) {
    res.status(500).json(err);
  }
};

ChatGPTが便利

Discussion