从 Knex 接收值时推送到数组

pushing to array when recieving value from Knex

我正在构建一个类似 Twitter 的应用程序。我的节点服务器使用 knex 从 sql 数据库检索数据。 我在应该获得 posts 的端点处的代码有问题('emails' 是一个数组):

app.post('/posts', (req, res) => {
    const { emails } = req.body;

    let arr = [];

    emails.forEach(email => {
        db('*')
        .from('posts')
        .where('email', '=', email)
            .then(result => {
                arr.push(result)
            })
    })

    res.json(arr)
})

当我在 promise 中控制台记录 'result' 时,我得到了所需的 post,但我在响应中得到了一个空数组。 我假设这个问题与它是一个承诺的事实有关? 我试图以某种方式将它变成一个异步函数,但没有成功。

每个 db 调用 return 一个承诺,您目前忽略了。因为您没有等待他们,所以您的 res.json 调用会在 arr.push 调用之前运行。

  1. 我把forEach改成了map
  2. 我 return 从 db 调用中编辑了承诺,所以现在我有一系列承诺。
  3. 我用 Promise.all
  4. 等待所有这些承诺
  5. 它的 then 将在数组中获取所有这些承诺的结果,因此不再需要 arr 数组。
  6. 然后我可以发送响应。

代码:

Promise.all(
  emails.map(
    email => db("*").from("posts").where("email", "=", email)
  )
).then(results => {
  res.json(results);
});