我正在进行一个监控系统项目,其中我将Arduino传感器数据发送到node.js服务器(通过GET请求),然后存储在MySQL数据库中。
当我成功将数据发送到服务器时,它连接到MySQL数据库并查询最后5个接收的记录以进行一些处理。
因此,我需要将这5条记录的行存储在变量中以供以后使用。这意味着我必须从变量中的connection.query获取行。
我读到我无法做到这一点的事实是因为node.js是异步的。所以我的问题是:
我没有把整个代码放在这里,但是我正在运行一个也无法正常运行的独立测试。这是:
var mysql = require('mysql');
var con = mysql.createConnection({
host : "127.0.0.1",
user : "root",
password: "xxxx",
database: "mydb",
port : 3306
});
var queryString = "SELECT id, temp1, temp2, temp3, temp4, level_ice_bank, flow FROM tempdata ORDER BY id DESC LIMIT 5";
con.connect(function(err) {
if (err) throw err;
});
var result_arr = [];
function setValue (value) {
result_arr = value;
}
con.query(queryString, function (err, rows, fields) {
if (err) throw err;
else {
//console.log(rows);
setValue(rows);
}
});
console.log(result_arr);
记录:
[]
但如果我取消注释console.log(rows);
,它会记录我需要存储在变量result_arr
中的内容。
提前感谢所有人。
答案 0 :(得分:2)
您会看到此行为,因为con.query(...)
是一个异步函数。这意味着:
console.log(result_arr);
之前运行:
con.query(queryString, function (err, rows, fields) {
if (err) throw err;
else {
//console.log(rows);
setValue(rows);
}
});
(具体来说,setValue(rows)
来电)
要在您的示例中修复此问题,您可以执行以下操作:
con.query(queryString, function (err, rows, fields) {
if (err) throw err;
else {
setValue(rows);
console.log(result_arr);
}
});
如果您想做的不仅仅是记录数据,那么您可以调用一个取决于result_arr
回调con.query
的函数,如下所示:
con.query(queryString, function (err, rows, fields) {
if (err) throw err;
else {
setValue(rows);
doCleverStuffWithData();
}
});
function doCleverStuffWithData() {
// Do something with result_arr
}