我无法将对象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 });
});
});
我可能在这里犯了一些愚蠢的错误,但是我对此并不陌生。
答案 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..')
}
})