Home > Net >  NodeJS Array not filling up
NodeJS Array not filling up

Time:09-28

Im using mongodb as a database after getting the valuation data which are more then one , i loop inside them and get the offers according to the offres_id , I asure you that the database has data inside and to querys are working correctly in fact if i console log them in each iteration i get this result

{
  offre: [
    {
      _id: new ObjectId("63320bf87123db5691c51392"),
      user_id: '63304e44aa63c519d887dac1',
      brand: 'HP',
      model: 'AZGGH-89855A',
      photo: '16642242480661659650294043-bs-5.png', 
      scan_method: 'manual',
      __v: 0
    }
  ],
  valuation: {
    _id: new ObjectId("63320d39a5677df3cebcbdae"),
    user_id: '63304e44aa63c519d887dac1',
    offre_id: '63320bf87123db5691c51392',
    given_price: '1236',
    comment: 'no comment',
    __v: 0
  }
}
{
  offre: [
    {
      _id: new ObjectId("6334202a8c7e6d90b35ee999"),
      user_id: '63304e44aa63c519d887dac1',
      brand: 'DELL',
      model: 'AZGGH-89855A',
      photo: '1664360490280Capture.PNG',
      scan_method: 'manual',
      __v: 0
    }
  ],
  valuation: {
    _id: new ObjectId("633420be8c7e6d90b35ee99e"),
    user_id: '63304e44aa63c519d887dac1',
    offre_id: '6334202a8c7e6d90b35ee999',
    __v: 0
  }
}

but when i try storing each offre & valuation at the same array cell and return it i get this as a result

[]

However this is the code

router.get('/get', async (req, res) => {
    try {
        Valuation.find({ user_id: req.session.userID })
            .exec()
            .then(valuation => {
                let myData = []; 
                if (valuation) {
                    for (let i = 0; i < valuation.length; i  ) {
                        Offre.find({_id : valuation[i].offre_id})
                        .exec()
                        .then(offre=>{
                            myData.push({offre : offre, valuation : valuation[i]})
                        })
                    }
                    res.status(200).json(myData)
                   


                } else {
                    res.status(404).json('no valuations found')
                }
            })
            .catch(error => {
                res.status(500).json(error.message)
            })
    } catch (error) {
        res.status(500).json({ error: error.message })
    }
})

CodePudding user response:

Since you're already using async, it would be a shame to not use await to simplify your code:

router.get("/get", async (req, res) => {
  try {
    const valuation = await Valuation.find({ user_id: req.session.userID }).exec();
    if (valuation) {
      let myData = [];
      for (let i = 0; i < valuation.length; i  ) {
        const offre = await Offre.find({ _id: valuation[i].offre_id }).exec();
        myData.push({ offre: offre, valuation: valuation[i] });
      }
      res.status(200).json(myData);
    } else {
      res.status(404).json("no valuations found");
    }
  } catch (error) {
    res.status(500).json({ error: error.message });
  }
});

You can probably also speed up the Offre query by using an $in query to retrieve all offres with one query, but that's another thing.

  • Related