【问题标题】:Await sql and push to array before executing the result在执行结果之前等待 sql 并推送到数组
【发布时间】:2021-08-03 08:08:10
【问题描述】:

我正在使用 mysql npm 包从数据库中获取数据。 我的目标是从lists 表中添加每个list(id) 并将其推送到lists 数组中。 我从数据库中获取了正确的数据,但是当我 result 时,查询 lists 数组为空。

我认为我必须在代码中添加asyncawait 才能使其工作。在几个地方尝试过,但我没有成功。知道我做错了什么吗?

// GET - get all grocery_lists
Grocery_list.getAll = (result) => {
  let lists = []; // <--- List Array

  sql.query("SELECT id FROM lists", (err, res) => { // <--- Get all id from 'lists' table
    if (err) {
      console.log(err);
    }

    res.forEach(list => { // <--- Loop thru all lists
      sql.query(`
        SELECT items.id, items.name, items_x_lists.purchased
        FROM items_x_lists
        INNER JOIN items ON items_x_lists.itemId = items.id
        WHERE items_x_lists.listId = ${list.id};
      `, (err, res) => { // <--- Get all items for ${list.id}  from 'items' table
        if (err) {
          console.log(err);
        }

        const list = {};
        list.id = res.id;

        console.log(list); // <--- { id: 1 } ... { id: 2 }
        lists.push(list);


      });
    });
    result(null, lists); // <--- returning empty array instead of [{ id: 1 }, { id: 2 }]
  });
};

【问题讨论】:

    标签: javascript mysql node.js async-await


    【解决方案1】:

    我认为您可以像这样简单地做到这一点(不是确切的代码),但我认为您已经明白了:

    // GET - get all grocery_lists
    Grocery_list.getAll = (result) => {
      getData().then(data => {
        // call result(data);
      }).catch(err => {
        // handle error for no data or any other errors
      })
    }
    
    const getData = async () => {
      try {
        var res = await sql.query("SELECT id FROM lists");
        // Handle error if no data found
        if (!res) { Promise.reject("No data found"); }
      } catch (error) {
        return Promise.reject(error);
      }
    
      const listIds = res.map(id => id);  // array of ids
    
      try {
        var data = await sql.query(`
            SELECT items.id, items.name, items_x_lists.purchased
            FROM items_x_lists
            INNER JOIN items ON items_x_lists.itemId = items.id
            WHERE items_x_lists.listId in ${listIds};`);
        // Handle error if no data found
        if (!data) { return Promise.reject("No data found") }
      } catch (error) {
        return Promise.reject(error);
      }
    
      return Promise.resolve(data)
    }
    

    【讨论】:

      【解决方案2】:

      这可能是解决方案

      Grocery_list.getAll = async (result) =&gt; { return sql.query("SELECT id FROM lists", (err, res) =&gt; { // &lt;--- Get all id from 'lists' table if (err) { console.log(err); } }); };

      【讨论】:

      • 没用。我敢肯定,如果您不使用 await 任何代码,您只需 async 就不会产生任何影响。
      • Grocery_list.getAll = async (result) => { return sql.query("SELECT id FROM lists", (err, res) => { //
      • 异步等待返回尝试这可能是为了加快 sql.query 的返回速度
      • 如果这不起作用,请尝试将 await 放置在 return 的位置
      【解决方案3】:

      我在外面,所以只能用手机编辑。如果布局很奇怪,我很抱歉。

      首先,如果是我,我会调整几个地方

      1.创建异步函数并使用Promise.all技术

      async function queryAll(querys){
        return await Promise.all(querys);
      }
      

      2.创建一个Promise函数来执行每条sql

      const queryPromise = id => {
        return new Promise((resolve, reject) => {
          sql.query(
            'SELECT items.id, items.name, items_x_lists.purchased FROM items_x_lists INNER JOIN items ON items_x_lists.itemId = items.id WHERE items_x_lists.listId = ? ;',
            id,
            (err, rows, fields) => {
              console.log(rows);
              if (err) reject(err);
              else resolve(rows);
            }
          );
        });
      };
      

      3.调整getAll事件的内部逻辑

      const querys = []
      res.forEach(list => {
        querys.push(queryPromise(list.id));
      });
      const querysResults = await queryAll(querys);// remember to use async for function
      querysResults.forEach(querysResult => {
        lists.push({id:querysResult['id']});
      });
      

      由于手头没有电脑,可能会有一些情况需要判断,但大致这样可以正常工作。

      希望对你有帮助:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-09
        • 1970-01-01
        相关资源
        最近更新 更多