【问题标题】:how to wait for model.save() in Mongoose如何在 Mongoose 中等待 model.save()
【发布时间】:2020-11-05 17:58:40
【问题描述】:

我有这样的功能:

createNewUser async (user) {
    const newUser = new User();
     newUser.name = user.name;
     newUser.password = user.password;
     let result = await newUser.save((err, data) => {
         if (err) return err;
         console.log(data);
         return data;
     })
     console.log(result) // Undefined
}

结果返回 undefined 并且它在 console.log(data) 之前运行,这很奇怪。有什么方法可以得到 newUser.save() 的结果,要么是错误,要么是成功保存的数据?

【问题讨论】:

  • 这能回答你的问题吗? Mongoose await save
  • 我在发布这个帖子之前看到了,但我不知道如果我想等待它,我不能把回调放在那里。

标签: javascript node.js mongodb mongoose


【解决方案1】:

由于您将回调传递给save,它将不再返回承诺,因此使用await 不起作用。

如果您希望它返回一个承诺,那么不要传递回调,您可以使用try-catch 块来检测错误:

const createNewUser = async (user) => {
  const newUser = new User();
  newUser.name = user.name;
  newUser.password = user.password;
  try {
    const result = await newUser.save();
    console.log(result);
  } catch (err) {
    console.log(err);
  }
};

【讨论】:

    【解决方案2】:

    如果要使用async/awaitpromises,则不必使用回调。 这一刻在documentation 中得到了明确的说明。

    所以,正确的代码:

    async createNewUser (user) {
        const newUser = new User();
        newUser.name = user.name;
        newUser.password = user.password;
    
        const result = await newUser.save();
        console.log(result); // result
    }
    

    如果您需要处理错误(强烈建议这样做,但在您的代码错误处理程序中不做任何事情),您可以将其包装到 try/catch

    async createNewUser (user) {
        const newUser = new User();
        newUser.name = user.name;
        newUser.password = user.password;
    
        try {
          const result = await newUser.save();
          console.log(result); // result
        } catch (err) {
          console.error("something goes wrong");
        }
    }
    

    【讨论】:

    • createNewUser async (user) { 这是语法错误吧! async 关键字应该在函数名之前。
    【解决方案3】:

    您也可以使用此简码。如果需要,可以将该函数包含在 try-catch 块中。

    async createNewUser (user) {
        const result = new User({
            name: user.name,
            password: user.password
        });
        console.log(await result.save())
    }
    

    【讨论】:

      猜你喜欢
      • 2022-12-18
      • 2018-05-22
      • 2019-08-16
      • 2019-11-30
      • 1970-01-01
      • 2019-02-03
      • 1970-01-01
      • 2018-06-11
      • 2018-01-13
      相关资源
      最近更新 更多