【问题标题】:Should I do database change inside each fetch request, or inside Promise.all?我应该在每个获取请求中还是在 Promise.all 中更改数据库?
【发布时间】:2023-01-07 16:00:23
【问题描述】:

我想使用 PokeAPI 遍历前 151 个 Pokemon,并将每个 Pokemon 添加到我的 mongo 数据库中。

我已经有了 pokemon 的模式,我只是在其中保存它们的字符串名称和它们的一系列动作。

我正在遍历 axios 调用,并将它们存储到一系列承诺中,并等待它们解决

app.get('/', async (req, res) => {
    const promises = []
 
    for (let i = 1; i <= 151; i++) {
        promises.push(axios.get(`https://pokeapi.co/api/v2/pokemon/${i}`))
    }
    await Promise.all(promises).then(async (p) => {
        const newPokemon = new Pokemon({
            name: p.name,
            moves: p.moves,
        })

        await newPokemon.save()
    })

})

这完全正确吗?我应该在哪里进行数据库查询,在单个 axios 调用中还是在 promise.all 中?

【问题讨论】:

  • 这是不正确的。在您的代码中,p 将是所有 axios 调用的解析值数组。因此,p.namep.moves 将是undefined,因为p 是您的值的数组。

标签: node.js mongodb api


【解决方案1】:

Promise.all 返回值数组。你应该使用 insertMany 函数一次插入所有的口袋妖怪:

await Promise.all(promises).then(async (pokemons) => {
    try {
        await Pokemon.insertMany(pokemons);
    } catch (err) {
        console.error(err);
    }
})

【讨论】:

    猜你喜欢
    • 2020-09-13
    • 1970-01-01
    • 2012-08-14
    • 2019-09-15
    • 1970-01-01
    • 2016-07-28
    • 2012-12-29
    • 2019-09-19
    • 1970-01-01
    相关资源
    最近更新 更多