【发布时间】:2017-12-10 05:48:58
【问题描述】:
我正在做一个监控系统项目,其中我将 Arduino 传感器数据发送到 node.js 服务器(通过 GET 请求),然后存储在 MySQL 数据库中。
每当我成功向服务器发送数据时,它都会连接到 MySQL DB 并查询最近收到的 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 感谢您的解释!我或多或少地理解它必须是那样的东西。你知道我怎样才能让
setValues(rows);在console.log(result_arr);之前发生吗? -
见丹的回答。这是正确的方法。
标签: mysql node.js node-mysql