javascript 无法将用户保存到MongoDB数据库

jvlzgdj9  于 2023-06-04  发布在  Java
关注(0)|答案(2)|浏览(173)

所以我试图将用户详细信息保存到我的MongoDB数据库。在用bcrypt对输入的密码进行散列之前,我成功地保存了数据
我无法保存用户详细信息到数据库后,哈希密码。
这是我的代码

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

router.post("/register", async (req, res) => {
  bcrypt.genSalt(10, function (err, Salt) {
    bcrypt.hash(req.body.password, Salt, function (err, hash) {
      if (err) {
        return console.log("Cannot Encrypt");
      }

      var hashedPassword = hash;
      console.log(hashedPassword);

      var newUser = new User({
        username: req.body.username,
        email: req.body.email,
        password: hashedPassword,
      });

      try {
        const user = newUser.save();
        res.status(200).json({
            status: "user created successfully",
            message: {
                user: user
            }
        });
      } catch (error) {
        res.status(404).json({
          status: "fail",
          message: error,
        });
      }
    });
  });
});

module.exports = router;

下面是 Postman 截图和VSCode终端的截图。
VSCode_terminal
PostmanAPI_screenshot

wyyhbhjk

wyyhbhjk1#

问题是由于加密密码时未使用异步/等待,但有一种重要的方法可以在不使用await的情况下执行操作,并使用promise进行错误处理

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

router.post("/register", (req, res) => {
  bcrypt.genSalt(10)
    .then((salt) => {

      //use promise
      bcrypt.hash(req.body.password, salt)
        .then((hashedPassword) => {
          var newUser = new User({
            username: req.body.username,
            email: req.body.email,
            password: hashedPassword,
          });

          newUser.save()
            .then((user) => {
              res.status(200).json({
                status: "user created successfully",
                message: {
                  user: user,
                },
              });
            })
            .catch((error) => {
              res.status(404).json({
                status: "fail",
                message: error,
              });
            });
        })
        .catch((error) => {
          res.status(404).json({
            status: "fail",
            message: error,
          });
        });
    })
    .catch((error) => {
      //handle error incase of failure
      res.status(404).json({
        status: "fail",
        message: error,
      });
    });
});

module.exports = router;

我用thencatch替换了await关键字,以处理异步函数返回的promise。

nkcskrwz

nkcskrwz2#

这个问题似乎与代码的异步特性有关。bcrypt.hash函数是异步的,并在回调函数中返回哈希密码。但是,代码没有正确处理异步行为,在哈希完成之前执行了newUser.save()行。
要解决这个问题,您可以在Promise中对密码进行散列后 Package 代码,并使用async/await来正确处理异步行为。下面是代码的更新版本:

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

router.post("/register", async (req, res) => {
  try {
    const salt = await bcrypt.genSalt(10);
    const hashedPassword = await bcrypt.hash(req.body.password, salt);

    var newUser = new User({
      username: req.body.username,
      email: req.body.email,
      password: hashedPassword,
    });

    const user = await newUser.save();

    res.status(200).json({
      status: "user created successfully",
      message: {
        user: user,
      },
    });
  } catch (error) {
    res.status(404).json({
      status: "fail",
      message: error,
    });
  }
});

module.exports = router;

在这个更新的代码中,等待bcrypt.genSaltbcrypt.hash函数,以确保在继续之前完成散列。也会等待newUser.save()行,以确保在发送响应之前将用户保存到数据库。
通过使用async/await,您可以在正确处理异步操作的同时,以更类似于同步的风格编写代码。

相关问题