我正在做一个监控系统项目,在该项目中,我将Arduino传感器数据发送到node.js服务器(通过GET请求),然后存储在MySQL数据库中。将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
存储。
在此先感谢大家。
线程不会等待con.query完成。它会在执行con.query行后立即执行console.log(result_arr),这就是为什么没有记录任何值,因为con.query还没有完成查询。取消注释后,您会得到一个结果//console.log (rows);因为con.query完成了它的执行。将它视为con.query执行时,会创建一个新线程来运行它的执行,并且主线程将继续其生命,即使con.query尚未完成。 – suguspnk
@suguspnk谢谢你的解释!我或多或少地理解它必须是这样的。你知道我该怎么做'setValues(rows);'在console.log(result_arr);'之前发生吗? – arocha
请看dan的回答。这是正确的方法。 – suguspnk