Вернуть опубликованные данные с помощью res.send после отправки запроса? - PullRequest
0 голосов
/ 03 июля 2019

У меня есть пост-маршрут, который получает массив строк из req.body.Затем он берет массив и несколько раз запрашивает мою локальную базу данных MySQL и извлекает некоторые данные, которые я хочу отправить обратно клиенту (реагирует), а затем сохраняет их в состоянии.

Проблема, с которой я столкнулся,хранение моих данных в массиве для успешной отправки с помощью метода res.send или res.json.

Я полагаю, что это может быть проблема, связанная с обработкой области другим способом, но я нахожусь в тупике.

Я пытался переместить расположение исходного объявления переменной массива, нов лучшем случае с res.send(aisleArr) я получаю только пустой массив.

Я также пытался не объявлять aisleArr перед методом push, думая, что он создаст глобальный объект aisleArr, но безрезультатно.

router.post('/complete', (req, res) => {

  const list = req.body;

  let aisleArr = [];

  list.map(item =>
    db.item.findAll({
      where: {'$item.name$': item}
      })
      .then(data => data.map( data => 
        db.aisle.findAll({
          where: {'$aisle.id$': data.dataValues.aisleId, '$aisle.storeId$': 2}
        }).then( result => { 

          if(result[0]){
            aisleArr.push(result[0].name)
          }else{
            console.log('no match')}})
        ) 
      )
    )
res.send(aisleArr)
});

В клиентской консоли только пустой массивполучено по окончании отправки.

1 Ответ

0 голосов
/ 03 июля 2019

Похоже, вам может потребоваться убедиться, что итератор map завершен, прежде чем отправлять значение. Несмотря на то, что возвращаемые значения связаны с обещаниями, присваивание aisleArr не выполняется, и, вероятно, res.send запускается до завершения итератора. Использование async / await обеспечит более простой способ убедиться, что назначение завершено, прежде чем двигаться вперед.

Например:

router.post('/complete', async (req, res) => {

  const list = req.body;

  const aisleArr = await list.map(item =>
    db.item.findAll({
      where: {'$item.name$': item}
    })
    .then(data =>
      data.map(newData =>
        db.aisle.findAll({
          where: {'$aisle.id$': newData.dataValues.aisleId, '$aisle.storeId$': 2}
        })
        .then(result => {
          if (result[0].name) {
            return result[0].name;
          } else {
            console.log('no match');
          }
        });
      );
    );
  ).filter(aisle => aisle);
  // the filter at the end will remove null values
  // (when nothing is returned from the last call to .then)

  res.send(aisleArr);
});

Я не запускал эту программу, так что может потребоваться несколько изменений, но я надеюсь, что это хорошая отправная точка. В целом, я думаю, что главное, на что нужно обратить внимание, это то, что map завершено, прежде чем вы позвоните res.send. Может быть полезно добавить еще несколько console.logs, чтобы убедиться, что это проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...