如何在异步函数中重新组织我的收益?

时间:2019-12-27 23:38:04

标签: javascript node.js express

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


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

我需要这样重组user data的退货:

{
   name: "Tom",
   age: 57
}

变成这样:

{
   message: "User is found successfully", 
   success: true, 
   user: user
}

到目前为止,我可以通过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 };
        }
      })

我可以对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 };
    });
}

提前谢谢!

1 个答案:

答案 0 :(得分:5)

大多数数据库API不同时支持回调和Promise。如果传递回调,则它们不会返回承诺。选择一种或另一种。您使用.then()的第一种方法就很好用,因为这都是基于promise的。

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

如果您想使用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 };
    }
}

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