postman 错误[错误_HTTP_HEADERS_SENT]:无法识别多个请求

yrefmtwq  于 2022-11-07  发布在  Postman
关注(0)|答案(1)|浏览(151)

我有这个错误:错误[错误_HTTP_HEADERS_SENT]:发送到客户端后无法设置头。根据我的理解,问题是我试图向同一个http请求发送多个响应。我的直觉告诉我,是这部分搞砸了:

catch (err) {
   res.status(400).json(err);
  }

因为如果在数据库中没有找到用户/密码,我们已经发送了状态(400)。我说的对吗?更重要的是(这也是让我抓狂的地方),我正在跟踪一个YT tuto,他的代码和我的完全一样,但他的代码似乎没有任何问题。
我的代码:

const router = require("express").Router();
const User = require("../models/Users");
const bcrypt = require("bcrypt");

//LOGIN
router.post("/login", async (req, res) => {
  try {
    const user = await User.findOne({ username: req.body.username });
    !user && res.status(400).json("Wrong credentials!");

    const validated = await bcrypt.compare(req.body.password, user.password);
    !validated && res.status(400).json("Wrong credentiaaaals!");

    const { password, ...others } = user._doc;
     res.status(200).json(others);
  } catch (err) {
   res.status(500).json(err);
  }
});

module.exports = router;

他的代号:

//LOGIN
router.post("/login", async (req, res) => {
  try {
    const user = await User.findOne({ username: req.body.username });
    !user && res.status(400).json("Wrong credentials!");

    const validated = await bcrypt.compare(req.body.password, user.password);
    !validated && res.status(400).json("Wrong credentials!");

    const { password, ...others } = user._doc;
    res.status(200).json(others);
  } catch (err) {
    res.status(500).json(err);
  }
});

module.exports = router;

我做错什么了吗?我的React不好吗?谢谢!

mqxuamgl

mqxuamgl1#

你是对的,你的代码试图多次向客户端发送数据。问题是在调用.json("Wrong credentials!")完成后,客户端的写流将关闭,你将无法向客户端发送任何其他数据。框架知道检测到它并向你显示bug。
在您的代码中,在方法.json("Wrong credentials!")完成自己的执行后,程序将继续并尝试执行下面的行...
您只需要添加return,这样程序将在向客户端发送响应后退出当前流。

const router = require("express").Router();
const User = require("../models/Users");
const bcrypt = require("bcrypt");

//LOGIN
router.post("/login", async (req, res) => {
  try {
    const user = await User.findOne({ username: req.body.username });
    if (!user) {
      return res.status(400).json("Wrong credentials!"); // without return the code will continue to execute next lines
    }

    const validated = await bcrypt.compare(req.body.password, user.password);
    if (!validated) {
      return res.status(400).json("Wrong credentiaaaals!"); // without return the code will continue to execute next lines
    }

    const { password, ...others } = user._doc;
    res.status(200).json(others); // return is not necessary, because there is no cod which will be executed after we back from the json method
  } catch (err) {
    res.status(500).json(err); // return is not necessary, because there is no cod which will be executed after we back from the json method
  }
});

module.exports = router;

相关问题