нажатие на массив при получении значения из Knex - PullRequest
1 голос
/ 07 апреля 2020

Я создаю твиттероподобное приложение. Мой Node-сервер извлекает данные из базы данных sql, используя knex. у меня есть проблема с кодом в конечной точке, которая должна получать сообщения ('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)
})

, когда я консоль записываю 'result' внутри обещания, я получаю желаемый пост, но я получаю пустой массив в ответе. Я предполагаю, что проблема имеет какое-то отношение к тому, что это обещание? я пытался как-то превратить это в асин c функцию, но не смог заставить ее работать.

1 Ответ

1 голос
/ 07 апреля 2020

Каждый из этих db вызовов возвращает обещание, которое вы в настоящее время игнорируете. И поскольку вы их не ждете, ваш res.json вызов выполняется до arr.push вызовов.

  1. Я изменил forEach на map
  2. Я вернул обещания из вызовов db, так что теперь у меня есть массив обещаний.
  3. Я ждал всех этих обещаний с помощью Promise.all
  4. Его then получит результаты всех этих обещания в массиве, так что больше нет необходимости в массиве arr.
  5. Тогда я могу отправить ответ.

Код:

Promise.all(
  emails.map(
    email => db("*").from("posts").where("email", "=", email)
  )
).then(results => {
  res.json(results);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...