ExpressJS res send before database loop request

Issue

I have a postgres database. It contains records that have a column that refers to other similar records. The column format is JSON.
So I get a record, it has links to other records. Such nesting can be n quantity. Therefore, I cannot know in advance how many requests I will need. The fact is that all these requests must be made through an asynchronous method, since I use the "pg" library. But res.send is a synchronous method and it is executed on the stack before the first iteration of the loop is completed. As a result, I am getting incomplete data.
I understand what the problem is, but I don’t understand the solution

const dbResult = await db.query("SELECT * FROM docs where id = 17");//17 is for example
    const doc = dbResult.rows[0];
    doc.linked.forEach(linked => {
      linked.assignedDocs = [];
      linked.links.forEach(async link => {
        const dbRes = await db.query("SELECT name, img FROM docs WHERE id = $1", [link.refId])
        link.assignedDocs.push({
          id: link.refId,
          name: dbRes.rows[0].name,
          img: dbRes.rows[0].img,
        })
      })
    });
    res.send(doc);

Solution

forEach doesn’t wait for async/await, use for … of with async blocks

for (const linked of doc.linked) {
    // ...
    const dbRes = await func();
}

Answered By – SineMatha

This Answer collected from stackoverflow, is licensed under cc by-sa 2.5 , cc by-sa 3.0 and cc by-sa 4.0

Leave a Reply

(*) Required, Your email will not be published