在mongodb中如何正确处理Promise?

时间:2018-11-05 18:27:15

标签: mongodb promise

我正在使用mongodb和node创建用户创建页面。获取名称,电子邮件和密码后,我尝试对密码进行哈希处理,然后将其保存到mongodb中。我可以通过使用异步和等待来遵循最佳实践。但是我想更多地了解Promise。因此,我尝试了以下操作,但是在某些时候我被卡住了。在这里,使用bcrypt安全地存储密码,步骤是1)bcrypt.getSalt 2)bcrypt.hash 3)使用新密码创建用户4)将其保存到mongodb。如果您查看以下代码,则这些步骤将实现。但是,将用户保存到mongodb时,用户超出范围。我的问题是如何通过Promise正确实施它们。你能给我一个很好的例子吗?我是初学者程序员,所以只想向专家学习。所以我来发布这个

router.post("/", (req, res, next) => {
  bcrypt
    .genSalt(10)
    .then(salt => {
      console.log(`Salt: ${salt}`);
      return bcrypt.hash(req.body.password, salt);
    })
    .then(hash => {
      console.log(`Hash: ${hash}`);
      return new User({
        name: req.body.name,
        email: req.body.email,
        password: hash
      });
    })
    .then(user => {
      console.log(`User: ${user}`);
      return User.findOne({ email: user.email }).exec();
    })
    .then(function(err, found_user) {
      if (err) {
        return next(err);
      }

      if (found_user) {
        console.log("found user");
      } else {
        user.save(function(err) {
          if (err) {
            return next(err);
          }
          res.redirect(user.url);
        });
      }
    })
    .catch(err => console.error(err.message));
});

1 个答案:

答案 0 :(得分:1)

您为什么需要通过new User?它不是猫鼬中的异步操作。它只是创建模型的新实例。您可以将代码重构为较短的代码,例如:

router.post("/", (req, res, next) =>
  User.findOne({ email: user.email }).exec().then(user => {
    if(user) {
      console.log("found user")
      next()
    } else {
      return bcrypt
        .genSalt(10)
        .then(salt => bcrypt.hash(req.body.password, salt))
        .then(hash => {
          var user = new User({
            name: req.body.name,
            email: req.body.email,
            password: hash
          });
          return user.save().exec()
      }).then(user => {
        // user is saved do whats next
        next()
      })
    }
  }).catch(err => console.error(err.message));
)