如何在 Mongoose 中等待 model.save()

Posted

技术标签:

【中文标题】如何在 Mongoose 中等待 model.save()【英文标题】:how to wait for model.save() in Mongoose 【发布时间】: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 我在发布这个帖子之前看到了,但我不知道如果我想等待它,我不能把回调放在那里。 【参考方案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())

【讨论】:

以上是关于如何在 Mongoose 中等待 model.save()的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose ORM 异步等待

Node.js/Mongoose 等待异步 For 循环

处理 Mongoose 异步/等待调用中的错误

Mongoose exec() 没有正确等待

为啥Node Js mongoose文档删除不等待不执行?

Mongoose 中的 Model.findById() - 异步/等待 [重复]