如何在异步函数中重新组织我的回报?

Val*_*y o 0 javascript node.js express

假设我有一个函数,可以从数据库中获取一些数据。


findById(id) {
    return Model.findById(id)
}

Run Code Online (Sandbox Code Playgroud)

我需要重新组织这样的回报user data

{
   name: "Tom",
   age: 57
}

Run Code Online (Sandbox Code Playgroud)

变成这样:

{
   message: "User is found successfully", 
   success: true, 
   user: user
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,我可以用一个Promise "then"部分来管理它,如下所示:

return Model.findById(id)
      .then(user => {
        if (!user) {
          logger.warn(`Coundn't find user with id: ${id}`);
          return { message: `Coundn't find user with id: ${id}`, success: false, user: null };
        }
        return { message: `User with id: ${id}`, success: true, user: user };
      })
      .catch(err => {
        if (err) {
          logger.error(err.message);
          return { message: err.message, success: false, user: null };
        }
      })
Run Code Online (Sandbox Code Playgroud)

我可以用 a 做同样的事情async/await并退回我重新生成的退货吗?因为到目前为止它user object从数据库返回:

async findById(id) {

    return await this.model.findById(id, function (user, err) {
      if (err) {
        console.log('test');
        logger.error(err);
        return { message: err.message, success: false, user: null };
      }
      if (!user) {
        logger.warn(`Coundn't find user with id: ${id}`);
        return { message: `Coundn't find user with id: ${id}`, success: false, user: null };
      }
      return { message: `User with id: ${id}`, success: true, user: user };
    });
}

Run Code Online (Sandbox Code Playgroud)

提前致谢!

jfr*_*d00 5

大多数数据库 API 不能同时支持回调和承诺。如果您传递回调,他们不会返回承诺。选择一种风格或另一种风格。您的第一种方法 using.then()效果很好,因为这都是基于承诺的。

您的第二种方法不起作用,因为您正在传递常规回调。这告诉数据库不要返回承诺,因为您使用的是较旧的回调样式,但您正在尝试使用该承诺。

如果你想使用async/await,你可以这样做:

async findById(id) {
    try {
        let user = await this.model.findById(id);
        if (user) {
            return { message: `User with id: ${id}`, success: true, user: user };
        } else {
            logger.warn(`Coundn't find user with id: ${id}`);
            return { message: `Coundn't find user with id: ${id}`, success: false, user: null };
        }
    } catch(e) {
        logger.error(err);
        return { message: err.message, success: false, user: null };
    }
}
Run Code Online (Sandbox Code Playgroud)

仅供参考,您可以从第一个代码块中删除处理程序中的if (err)测试.catch()。如果.catch()被触发,则存在错误 - 您无需测试是否存在错误。