【问题标题】:how to handle promise properly in working with mongodb? [duplicate]如何在使用 mongodb 时正确处理 promise? [复制]
【发布时间】:2018-11-06 03:34:17
【问题描述】:

我正在使用 mongodb 和节点创建用户创建页面。获得姓名、电子邮件和密码后,我尝试对密码进行哈希处理,然后保存到 mongodb。我本可以通过使用 async 和 await 来遵循最佳实践。但是我想更多地了解 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));
});

【问题讨论】:

  • ".then(function(err, found_user) { if (err) { return next(err); }" 完全关闭。一个promise永远不会用两个值来解决,当调用onfulfill回调时不会出错。

标签: mongodb promise


【解决方案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));
)

【讨论】:

  • 非常感谢您的评论。我还有一个返回 Promise 的函数,User.findOne({ email: user.email }).exec(),在 user.save 之前,需要检查新用户是否已经存在。所以..需要那个功能。将它集成到代码中的好方法是什么?
  • 好吧,我更新了答案。然后,您将首先检查用户是否存在,然后再执行其他任何操作等。
  • 非常感谢,它运行良好。我会根据你的代码深入思考。再次感谢您。
  • 很高兴它对您有所帮助。如果它解决了您的问题,您可以将其标记为答案。
猜你喜欢
  • 2021-05-09
  • 2019-05-25
  • 2022-01-18
  • 2017-08-21
  • 1970-01-01
  • 1970-01-01
  • 2016-12-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多