簡體   English   中英

數組推送給出空結果節點js

[英]Array push gives empty result node js

我正在創建一個 API 用於列出帶有圖像的行程數據和 pdf 基礎 url,一切正常,但我無法訪問循環的最后一個結果數組data_to_send

應用程序.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);
  }
};


異步等待

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
      }
    );
  }
}

這是因為 NodeJs 的異步行為,所以你必須相應地計划事情,即

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

上述代碼的 output 將是 1,然后是 3,然后是 2,這就是 NodeJs 的工作方式,它不等待 I/O 調用,即在您的情況下是 DB 查詢。 請查看 Promise 在 NodeJs 中的工作方式以獲取更多詳細信息。 以下是完成任務的方法:


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);
});

在不知道您正在使用什么數據庫或 ORM 的情況下很難回答,但我懷疑db.select是一種異步方法,即它返回一個Promise 如果是這樣,第二個控制台日志仍然看到“舊” data_to_send

嘗試在第一個db.select調用之前添加await (不要忘記app.get的第二個參數中回調前面的async

您的數據庫是異步的,因此console.log(data_to_send)在查詢完成執行之前被調用。 嘗試在第 1 行的(req, res)之前添加async ,然后在await之前db.select

這對我有用

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: "" });
  }


暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM