无法将MySQL返回的对象推送到数组中

时间:2020-07-26 17:26:32

标签: javascript mysql node.js arrays express

我无法将对象result1推入数组a。数组每次都返回为空。

  app.get('/freezer', (req, res) => {
  var a = [];
  var sql = `SELECT freezer_id FROM freezer_data`;
  db.query(sql, (err, result) => {
    if (err) throw err;
    result.forEach((rs) => {
      var sql1 = `SELECT * FROM freezer_data JOIN live_records ON freezer_data.freezer_id = live_records.freezer_id WHERE live_records.freezer_id = '${rs.freezer_id}' ORDER BY insert_datetime DESC LIMIT 1`;
      db.query(sql1, (err, result1) => {
        if (result1.length) {
          a.push(result1[0]);
        }
      });
    });
    console.log('arrobj', a);
    res.render('freezer.html', { freezers: a });
  });
});

我可能在这里犯了一些愚蠢的错误,但是我对此并不陌生。

2 个答案:

答案 0 :(得分:0)

您的console.log在更新数组a之前调用,因为db.query()是异步的,并且具有在将来某个时候调用的回调。

如果您尝试在此处检查阵列:

db.query(sql1, (err, result1) => {
        if (result1.length) {
          a.push(result1[0]);
          console.log(a);
        }
      });

它不会为空

答案 1 :(得分:0)

知道查询使用函数作为参数(回调)很重要,因此您不能在查询之外返回值。使用 async/await 或 promise 可能会帮助你。例如,我正在使用 util(内置 express 模块)。

const util = require('util');
const mysql = require('mysql');

// in this code, i am using connection pool
const databasePool = mysql.createPool({
  host: 'somehost', // ex. localhost 
  port: 'someport', // ex. 3306
  user: 'someuser', // ex. root
  password: 'somepass', // ex. 123456
  database: 'somedbname', // ex. mydatabase
});

// i create variable for querying and use util for async/await
let performQuery = util.promisify(databasePool.query).bind(databasePool); // register databasePool.query and bind databasePool

然后在您的路线中:

app.get('/someroute', async (req,res,next) => {
  // declaring empty array
  const myArray = []
  // write query string here and use try to success result and catch the error 
  const myQuery = `SELECT freezer_id FROM freezer_data`;
  try {
    // executing the query string and use await
    let getResult = await performQuery(myQuery)
    getResult.forEach((items) => {
      const myDeepQuery = `SELECT * FROM freezer_data JOIN live_records ON freezer_data.freezer_id = live_records.freezer_id WHERE live_records.freezer_id = ${items.freezer_id} ORDER BY insert_datetime DESC LIMIT 1`;
      let getDeepResult = await performQuery(myDeepQuery);
      myArray.push(getDeepResult)
    });
    res.send(myArray)
  } catch (err) {
    res.send('oopss..')
  }
})