【问题标题】:how check if user exist in nodejs如何检查用户是否存在于nodejs中
【发布时间】:2020-12-25 10:16:58
【问题描述】:

我正在使用 nodejs 和 mongoDB(mongoose) 制作身份验证系统,但出现错误:

错误:UnhandledPromiseRejectionWarning: Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client at F:\tryMern\index.js:68:13

index.js(重要部分):

app.post("/api/auth", (req, res) => {
  if (req.body.username && req.body.pass && req.body.status == "new") {
    User.find({ username: req.body.username }, (err, users) => {
      if (!err) {
        if (users.length > 0) {
          return res.json({ error: "The username is taken." });
        }
      }
    });

    const validReq = validate.validate({
      username: req.body.username,
      pass: req.body.pass,
    });

    if (validReq.error) {
      return res.json({ error: validReq.error.details[0].message });
    }
    bcrypt.hash(req.body.pass, 12).then((hashedPass) => {
      // console.log(hashedPass);
      const user = new User({
        username: req.body.username,
        password: hashedPass,
      });
      user.save().then((user) =>
        res.json({
          status: "OK",
          username: user.username,
          token: jwt.sign({ _id: user._id }, jwtKey),
        })
      );
    });

    return;
  }

  User.find({ username: req.body.username }, (err, users) => {
    if (err) {
      console.log(err);
    } else {
      if (users.length > 0) {
        bcrypt.compare(req.body.pass, users[0].password, (err, hash) => {
          if (hash) {
            return res.json({
              validate: true,
              username: users[0].username,
              token: jwt.sign({ _id: users[0]._id }, jwtKey),
            });
          } else {
            return res.json({ validate: false });
          }
        });
      } else {
        return res.json({ validate: false });
      }
    }
  });
});

当我添加The username is taken 部分时出现错误(部分说查找用户,如果存在说用户名被占用) 如果有其他方法可以检查用户是否存在,请告知或解决此问题 谢谢:)

编辑: 当我尝试使用现有用户名提交用户时,响应为 { "error": "The username is taken." } 并且错误来了

【问题讨论】:

  • 您没有正确使用异步代码和回调。例如。在第 3ff 行定义的 User.find 的回调被调用之前,第 11 行中关于验证的代码将被执行。这种方式例如您可能会在第 6 行和第 17 行调用 res.send。这会导致错误 Headers already set 因为它们已经设置并且响应已经发送。我建议你阅读 JavaScript 中的异步代码、回调和 async/await。

标签: node.js mongodb express


【解决方案1】:

我解决了这个问题:


app.post("/api/auth", (req, res) => {
  if (req.body.username && req.body.pass && req.body.status == "new") {
    User.find({ username: req.body.username }, (err, users) => {
      if (!err) {
        if (users.length > 0) {
          res.json({ error: "The username is taken." });

          return;
        }
        const validReq = validate.validate({
          username: req.body.username,
          pass: req.body.pass,
        });

        if (validReq.error) {
          return res.json({ error: validReq.error.details[0].message });
        }
        bcrypt.hash(req.body.pass, 12).then((hashedPass) => {
          // console.log(hashedPass);
          const user = new User({
            username: req.body.username,
            password: hashedPass,
          });
          user.save().then((user) =>
            res.json({
              status: "OK",
              username: user.username,
              token: jwt.sign({ _id: user._id }, jwtKey),
            })
          );
        });
      }
    });

    return;
  }

  User.find({ username: req.body.username }, (err, users) => {
    if (err) {
      console.log(err);
    } else {
      if (users.length > 0) {
        bcrypt.compare(req.body.pass, users[0].password, (err, hash) => {
          if (hash) {
            return res.json({
              validate: true,
              username: users[0].username,
              token: jwt.sign({ _id: users[0]._id }, jwtKey),
            });
          } else {
            return res.json({ validate: false });
          }
        });
      } else {
        return res.json({ validate: false });
      }
    }
  });
});

【讨论】:

  • 不错!您也可以将此答案标记为已接受。接受答案和即将到来的 cmets 或答案有助于社区了解什么是有价值的。
猜你喜欢
  • 2019-01-04
  • 1970-01-01
  • 2019-11-01
  • 1970-01-01
  • 2018-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-16
相关资源
最近更新 更多