首页 > 解决方案 > 如何响应 Node/Express/Postgresql 中的查询结果数组?

问题描述

新手在这里。我正在尝试通过两个select查询从本地数据库中获取对象数组,使用 knex.js 和 postgresql,如下所示:

app.get('/trips/:name', (req, res) => {
  const {name} = req.params;
  db.select('tripid').from('member')
    .where('name', '=', name)
    .then(data => {
      const array = data.map(elem => {
        db.select('tripname')
          .from('trip')
          .where('id', '=', elem.tripid)
          .then(obj => {
            array.push(obj[0])
          })
    })
    return array
  })
  .then(arr => res.json(arr))
  .catch(err => res.status(400).json(err))
})

我想将第二个查询返回的所有对象推入一个数组并响应前端。但是,它总是返回一个空数组,我怀疑这 .map 是异步的,所以在循环完成之前返回数组。我怎样才能解决这个问题?任何帮助表示赞赏。谢谢。抱歉,如果我的代码难以阅读。

标签: node.jspostgresqlknex.js

解决方案


使用 async await 尝试这种方式:

app.get('/trips/:name', async (req, res) => {
  try{
  const {name} = req.params;
   let arr = await db.select('tripid').from('member').where('name', '=', name);
   if(arr && arr.length>0){
     for(let item of arr){
          let tripResult  = await db.select('tripname').from('trip').where('id', '=', item.tripid).catch(e=>e);
          item.trip = tripResult && tripResult[0]? tripResult[0]:null;
     }
   }
   return res.json(arr);
  }catch(error){
    return res.status(400).json(error);
  }
}

第二种方式:

app.get('/trips/:name',(req, res) => {

  const {name} = req.params;
   db.select('tripid').from('member').where('name', '=', name)
   .then(arr =>{   


     Promise.all(arr.map(item =>{

     db.select('tripname')
       .from('trip')
       .where('id', '=', item.tripid)
       .then((tripResult=>{
            item.trip = tripResult && tripResult[0]? tripResult[0]:null;
            return item;
       }).catch(e=>e);

    })
   ).then(arr => {
        return res.status(200).json(arr);
   })   

}).catch(err => res.status(400).json(err));

推荐阅读