【问题标题】:Updating `let` variable in mongoose schema.save [duplicate]更新猫鼬模式中的`let`变量.save [重复]
【发布时间】:2018-10-21 12:24:20
【问题描述】:

我有一些这样的代码:

let addUser = (req, res) => {
    let user;
    let message = "";
    let status = 200;

    bcrypt.hash(password, salt_rounds, (err, hash) => {
        user = new user({
            ...
            password: hash,
        });

        user.save(err => {
            if(err) {
                message = "No success";
                status = 400;
            } else {
                message = "success";
            }
        });

        res.status(status).json({
            message: message,
        });
    });
};

但是,在发送响应时,message 变量是未定义的。我一直在寻找一段时间,不幸的是,一直未能找到与此问题类似的解决方案。

最终,我希望能够更新 bcrypt/.save 闭包中的消息、状态等变量。我尝试过使用回调和解决我认为由于天真而不起作用的承诺。无论如何,任何解决方案都将不胜感激!

注意:我不想使用任何其他库来解决这个问题(我真的怀疑首先需要)

提前致谢!

【问题讨论】:

  • 问题在于时机。 .save() 异步操作并调用您最终提供的回调,将其从编写代码的顺序中推出。效果是let messageres.json() 已经从中读取undefined 之后被分配了一个值。 – 一个快速的解决方案是移动res.json(),使其位于.save() 回调中。

标签: javascript mongoose mongoose-schema asynccallback


【解决方案1】:

试试这个,把message键放在双引号

let addUser = (req, res) => {
    let user;
    let message = "";
    let status = 200;

    bcrypt.hash(password, salt_rounds, (err, hash) => {
        user = new user({
            ...
            password: hash,
        });

        user.save(err => {
            if(err) {
                message = "No success";
                status = 400;
            } else {
                message = "success";
            }
        });

        res.status(status).json({
            "message": message,
        });
    });
};

【讨论】:

    【解决方案2】:

    user.save 更改为返回 Promise 的内容,然后在该 Promise 上调用 .then

    let addUser = (req, res) => {
      let user;
      let status = 200;
    
      bcrypt.hash(password, salt_rounds, (err, hash) => {
        user = new user({
          password: hash,
        });
    
        const savePromise = new Promise((resolve, reject) => {
          user.save(err => {
            if (err) {
              status = 400;
              reject("No success");
            } else {
              resolve("success");
            }
          });
        });
        savePromise.then(message => 
          res.status(status).json({ message })
        ).catch(message => 
          res.status(status).json({ message })
        );
      });
    };
    

    【讨论】:

      猜你喜欢
      • 2015-09-09
      • 1970-01-01
      • 1970-01-01
      • 2016-01-23
      • 2017-11-20
      • 2015-12-12
      • 2018-10-09
      • 2019-07-26
      • 2014-04-01
      相关资源
      最近更新 更多