如何在猫鼬中等待model.save()

时间:2020-07-16 05:55:35

标签: javascript node.js mongodb mongoose

我有一个类似的功能:

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
}

结果返回未定义,并且在console.log(data)之前运行,这很奇怪。是否有任何方法可以获取newUser.save()的结果是错误还是成功保存了数据?

3 个答案:

答案 0 :(得分:3)

由于您将回调传递给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);
  }
};

答案 1 :(得分:3)

如果要使用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");
    }
}

答案 2 :(得分:2)

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

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