Как ответить массивом результатов запроса в Node / Express / Postgresql? - PullRequest
0 голосов
/ 29 апреля 2020

newb ie здесь. Я пытаюсь получить массив объектов из моей локальной базы данных с помощью двух 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))
})

Я хочу получить sh все объекты, которые второй запрос возвращает в массив и отвечает переднему концу. Тем не менее, он всегда возвращает пустой массив, который я подозреваю, потому что .map является асинхронным, поэтому массив возвращается до завершения l oop. Как я могу это исправить? Любая помощь приветствуется. Спасибо. Извините, если мой код трудно читать.

1 Ответ

0 голосов
/ 29 апреля 2020

попробуйте этот способ, используя asyn c 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);
  }
}

2-й способ:

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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...