1

I am creating an API for listing trip data with image and pdf base url, All things are working fine but I can not access the last result array data_to_send out of for loop.

app.js

app.get("/getChallanList/:userId/:role", (req, res) => {
  const userData = req.params;

  let site_source = "";
  let site_destination = "";
  var site_from_name = "";
  const data_to_send = [];

  if (userData.role == "D") {
    db.select("trip", "*", `driver_id = '${req.params.userId}'`, (data) => {
      for (let i = 0; i < data.data.length; i++) {
        site_source = data.data[i].site_from;
        site_destination = data.data[i].site_to;

        db.select(
          "site",
          "*",
          `id in ('${site_source}','${site_destination}')`,
          (data_site) => {
            data.data[i].site_from = data_site.data[0].name;

            data.data[i].site_to = data_site.data[1].name;

            if (data.data[i].truck_challan_pdf != "") {
              data.data[i].truck_challan_pdf =
                base_url + "truckchallan/" + data.data[i].truck_challan_pdf;
            }
            if (data.data[i].driver_challan_pdf != "") {
              data.data[i].driver_challan_pdf =
                base_url + "driverchallan/" + data.data[i].driver_challan_pdf;
            }
            if (data.data[i].preparer_img != "") {
              data.data[i].preparer_img = base_url + data.data[i].preparer_img;
            }

            if (data.data[i].driver_img != "") {
              data.data[i].driver_img = base_url + data.data[i].driver_img;
            }

            data_to_send.push(data.data);
            // console.log(data_to_send); // working
          }
        );
      }
      console.log(data_to_send); // empty
    });
  }
}


db.select

let select = (table, column, condition, callback) => {
  try {
    let sql = "SELECT " + column + " FROM " + table + " WHERE " + condition;

    conn.query(sql, (err, results) => {
      if (err) {
        let data = {
          status: 0,
          data: sql,
          message: "Something went wrong!",
        };
        callback(data);
      } else {
        let data = {
          status: 1,
          data: results,
          message: "Success",
        };

        callback(data);
      }
    });
  } catch (err) {
    let data = {
      status: 0,
      data: err,
      message: "In catch",
    };
    callback(data);
  }
};


async await

app.get("/getChallanList/:userId/:role", async (req, res) => {
  const userData = req.params;

  let site_source = "";
  let site_destination = "";
  var site_from_name = "";
  const data_to_send = [];

  if (userData.role == "D") {
    await db.select(
      "trip",
      "*",
      `driver_id = '${req.params.userId}'`,
      async (data) => {
        // const data_to_send_ = [];
        for (let i = 0; i < data.data.length; i++) {
          site_source = data.data[i].site_from;
          site_destination = data.data[i].site_to;

          await db.select(
            "site",
            "*",
            `id in ('${site_source}','${site_destination}')`,
            (data_site) => {
              data.data[i].site_from = data_site.data[0].name;

              data.data[i].site_to = data_site.data[1].name;

              if (data.data[i].truck_challan_pdf != "") {
                data.data[i].truck_challan_pdf =
                  base_url + "truckchallan/" + data.data[i].truck_challan_pdf;
              }
              if (data.data[i].driver_challan_pdf != "") {
                data.data[i].driver_challan_pdf =
                  base_url + "driverchallan/" + data.data[i].driver_challan_pdf;
              }
              if (data.data[i].preparer_img != "") {
                data.data[i].preparer_img =
                  base_url + data.data[i].preparer_img;
              }

              if (data.data[i].driver_img != "") {
                data.data[i].driver_img = base_url + data.data[i].driver_img;
              }

              data_to_send.push(data.data);
              // console.log(data_to_send); // working
            }
          );
          // data_to_send_.push(data_to_send);
        }
        console.log(data_to_send); // empty
      }
    );
  }
}

4 Answers 4

1

this is because of the asynchronous behavior of NodeJs, so you have to plan things accordingly i.e

console.log(1)
db.select(
      "trip",
      "*",
      `driver_id = '${req.params.userId}'`,
      async (data) => {
console.log(2)
})
console.log(3)

The output of the above code would be 1 then 3 and then 2 and this is how NodeJs works it does not wait for I/O calls i.e DB query in your case. Please check how promises work in NodeJs for more details. Here is how you can accomplish your task:


const challanList = (userData) => {
  return new Promise((resolve, reject) => {
    const data_to_send = [];

    db.select("trip", "*", `driver_id = '${req.params.userId}'`, data => {
      for (let i = 0; i < data.data.length; i++) {
        const site_source = data.data[i].site_from;
        const site_destination = data.data[i].site_to;

        db.select("site", "*", `id in ('${site_source}','${site_destination}')`, data_site => {
          data.data[i].site_from = data_site.data[0].name;

          data.data[i].site_to = data_site.data[1].name;

          if (data.data[i].truck_challan_pdf != "") {
            data.data[i].truck_challan_pdf = base_url + "truckchallan/" + data.data[i].truck_challan_pdf;
          }
          if (data.data[i].driver_challan_pdf != "") {
            data.data[i].driver_challan_pdf = base_url + "driverchallan/" + data.data[i].driver_challan_pdf;
          }
          if (data.data[i].preparer_img != "") {
            data.data[i].preparer_img = base_url + data.data[i].preparer_img;
          }

          if (data.data[i].driver_img != "") {
            data.data[i].driver_img = base_url + data.data[i].driver_img;
          }

          data_to_send.push(data.data);
          // console.log(data_to_send); // working
        });
      }
      resolve(data_to_send);
    });
  });
};

app.get("/getChallanList/:userId/:role", async (req, res) => {
  const userData = req.params;
  const challanListResult =await challanList(userData);
  console.log(challanListResult);
  resp.json(challanListResult);
});
Sign up to request clarification or add additional context in comments.

Comments

0

Without knowing what database or ORM you are using it is difficult to answer, but my suspicion is that db.select is an asynchronous method, i.e. it is returning a Promise. If so, the second console log is still seeing the "old" data_to_send.

Try adding an await in front of the first db.select call. (Don't forget the async in front of the callback in second argument of app.get.

Comments

0

Your database is asynchronous so console.log(data_to_send) gets called before the query finished executing. Try adding async before (req, res) in line 1 then await before db.select.

1 Comment

async/await added in question but not working
0

This works for me

app.get("/getChallanList/:userId/:role", async (req, res) => {
  const userData = req.params;

  let site_source = "";
  let site_destination = "";
  var site_from_name = "";
  const data_to_send = [];

  if (userData.role == "D") {
    const data = await db.query(
      `SELECT * FROM trip WHERE driver_id = '${req.params.userId}'`
    );
    // console.log(data.length);
    // const data_to_send_ = [];
    for (let i = 0; i < data.length; i++) {
      site_source = data[i].site_from;
      site_destination = data[i].site_to;
      // cons
      const site_data = await db.query(
        `SELECT * FROM site WHERE id in ('${site_source}','${site_destination}')`
      );
      // console.log(site_data);

      db.select(
        "site",
        "*",
        `id in ('${site_source}','${site_destination}')`,
        (data_site) => {
          data[i].site_from = data_site.data[0].name;

          data[i].site_to = data_site.data[1].name;

          if (data[i].truck_challan_pdf != "") {
            data[i].truck_challan_pdf =
              base_url + "truckchallan/" + data[i].truck_challan_pdf;
          }
          if (data[i].driver_challan_pdf != "") {
            data[i].driver_challan_pdf =
              base_url + "driverchallan/" + data[i].driver_challan_pdf;
          }
          if (data[i].preparer_img != "") {
            data[i].preparer_img = base_url + data[i].preparer_img;
          }

          if (data[i].driver_img != "") {
            data[i].driver_img = base_url + data[i].driver_img;
          }

          data_to_send.push(data);
          // console.log(data.data);

          // console.log(data_to_send); // working
        }
      );
      // data_to_send_.push(data_to_send);
    }
    // console.log(data_to_send);

    // console.log(data_to_send);
    res.send({ success: 1, data: data, message: "" });
  }


Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.