为什么使用await/async的结果是undefined?

5

我有一个路由如下:

router.get("/my_resource", myController.getResult);

那么我的控制器就像这样:

getResult: async (req, res, next) => {
    try {
      const param = req.query.param;
      let response = {};
      if (param) {
        let [result1, result2] = await Promise.all([myModel.getResult1(param), myModel.getResult2(param)]);
        console.log(result1);
        console.log(result2);
      }
      res.send(response);
    } catch (e) { 
        next(e);
    }
  }

我的模型(查询mongodb)如下:

getResult1: (param) => {
    new Promise((resolve, reject) => {
      MongoSchema1.findById(param, (error, result) => {
        if (error) return reject(error);
        resolve(result ? result : {});
      }).select("field1 field2");
    })
  }

getResult2: (param) => {
  new Promise((resolve, reject) => {
    MongoSchema2.findById(param, (error, result) => {
      if (error) return reject(error);
      resolve(result ? result : {});
    }).select("field1 field2");
  })
}

在这里,当我尝试在模型函数中使用console.log()时,我可以看到结果不是undefined。我得到了正确的结果。然而,我可以看到控制器方法中的console.log()在模型方法中的console.log()之前执行。
在上面的代码中,我使用Promise.all()并行进行异步调用。然而,即使我尝试一次运行一个,我仍然会在控制器方法中得到未定义的结果。我做错了什么?我需要导入任何模块才能await吗?谢谢。

originalMailscrapeResult来自哪里?您只声明了result1result2,但从未使用过它们。此外,您的response始终为空对象。 - Bergi
@Bergi,抱歉,应该是result1result2。我已经更新了问题。 - kovac
1个回答

2
问题在于你的方法 getResult1getResult2 没有返回 Promises 对象。
请替换为:
  getResult1: (param) => {
    new Promise((resolve, reject) => {
      MongoSchema1.findById(param, (error, result) => {
        if (error) return reject(error);

        resolve(result ? result : {});
      }).select("field1 field2");
    })
  }

By

  getResult1: (param) => {
    return new Promise((resolve, reject) => {
      MongoSchema1.findById(param, (error, result) => {
        if (error) return reject(error);
        resolve(result ? result : {});
      }).select("field1 field2");
    });
  }

或者

  getResult1: param => new Promise((resolve, reject) => {
      MongoSchema1.findById(param, (error, result) => {
        if (error) return reject(error);

        resolve(result ? result : {});
      }).select("field1 field2"));
  }

或者

getResult1: async param => (await MongoSchema1.findById(param).select('field1 field2')) || {};

或者

getResult1: async param => (await MongoSchema1.findById(param, 'field1 field2')) || {};

1
非常感谢!由于这里有锁定,我将在几分钟内接受答案。 - kovac

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接