发出发布请求后,返回带有res.send的发布数据吗?

时间:2019-07-03 01:22:00

标签: javascript express

我有一个发布路由,该路由从req.body接收字符串数组。然后,它将使用该数组并查询我的本地MySQL数据库几次,并检索一些我想发送回客户端的数据(反应),然后存储在状态中。

我遇到的问题是将数据存储在数组中,以通过res.send或res.json方法成功发送。

我认为用另一种方式处理范围可能解决了这个问题,但我对此感到困惑。

我尝试移动原始数组变量声明的位置,但是充其量res.send(aisleArr)只能收到一个空数组。

我还尝试在push方法之前不声明'aisleArr',以为它将创建一个全局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 :(得分:0)

在发送值之前,您可能需要确保map迭代器是完整的。即使返回值与Promise链接在一起,对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以确保这是问题所在。