【问题标题】:cannot push object returned from mysql in array无法将 mysql 返回的对象推送到数组中
【发布时间】:2020-11-16 01:58:51
【问题描述】:

我无法将对象 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 });
  });
});

我可能在这里犯了一些愚蠢的错误,但我是新手。

【问题讨论】:

  • 您是否检查过sql1 是否返回结果? '$ {rs.freezer_id}' 可能不带引号
  • 是的,它返回一个结果。如果我在那里控制台日志结果,它返回我想要的结果

标签: javascript mysql node.js arrays express


【解决方案1】:

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

如果您尝试在此处检查数组:

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

不会是空的

【讨论】:

  • 是的,你是对的,那里不是空的,但我想在循环之外使用它。我想将它作为参数传递。
  • 让你函数异步并使用等待,否则你将不得不嵌套回调
  • 但是你的程序是异步的,没有办法在回调函数之外得到正确的数组,因为以后会调用回调函数
  • 你可以使用异步函数来帮助你
【解决方案2】:

重要的是要知道查询使用函数作为参数(回调),因此您不能在查询之外返回值。使用 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..')
  }
}) 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-29
    • 1970-01-01
    • 2020-12-20
    • 2018-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多