不能在MongoDB Model上使用async / await,即使它返回Promise?

时间:2018-02-28 12:26:56

标签: javascript node.js mongodb mongoose mongodb-query

我有一个获取用户广告资源的函数,然后是每个元素的price属性,其价格来自Price Collection

这是(不是整个功能,但我在这里得到错误):

async function updateUserInventory(inventory, userDetails, socket) {
    let newArray = await inv.map(item => {
        let price = await Price.findOne({ market_hash_name: item.market_hash_name });
        return {
            price: price.price
        }
        logger.debug(JSON.stringify(item, null, 2));
    });

    socket.emit('user inv', { items: newArray });

现在根据Mongo Docs,您可以使用回调调用Price.findOne,但您也可以使用promise(.then())调用它。这意味着你应该能够用await来调用它,因为它会返回一个promise。但是,唉,我收到的错误是:

D:\code\some-api\api\helpers\priceUpdater.js:129
        let price = await Price.findOne({ market_hash_name: item.market_hash_name });
                          ^^^^^

SyntaxError: Unexpected identifier
    at createScript (vm.js:80:10)
    at Object.runInThisContext (vm.js:139:10)
    at Module._compile (module.js:607:28)
    at Object.Module._extensions..js (module.js:654:10)
    at Module.load (module.js:556:32)
    at tryModuleLoad (module.js:499:12)

它没有await关键字,但我不能那样使用它,因为那时我会遇到异步性问题。

也许我没有正确使用async / await。有什么帮助吗?

1 个答案:

答案 0 :(得分:0)

对于遇到相同问题的任何人(在await或任何JS数组迭代器函数中使用.map),我通过调用Promise.all上的.map来解决它然后在迭代的元素上async。感谢@georg指针。

async function updateUserInventory(inventory, userDetails, socket) {
    let newArray = await Promise.all(inv.map(async (item) => {
        let price = await Price.findOne({ market_hash_name: item.market_hash_name });
        return {
            price: price.price
        }
        logger.debug(JSON.stringify(item, null, 2));
    }));

    socket.emit('user inv', { items: newArray });