将 mysql 查询行存储在变量中供以后使用
Store mysql query rows in variable for later use
我正在做一个监控系统项目,其中我将 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
中的内容。
在此先感谢大家。
您看到此行为是因为 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);
}
});
如果您想做的不仅仅是记录数据,那么您可以从 con.query
回调中调用一个依赖于 result_arr
的函数,如下所示:
con.query(queryString, function (err, rows, fields) {
if (err) throw err;
else {
setValue(rows);
doCleverStuffWithData();
}
});
function doCleverStuffWithData() {
// Do something with result_arr
}
我正在做一个监控系统项目,其中我将 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
中的内容。
在此先感谢大家。
您看到此行为是因为 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);
}
});
如果您想做的不仅仅是记录数据,那么您可以从 con.query
回调中调用一个依赖于 result_arr
的函数,如下所示:
con.query(queryString, function (err, rows, fields) {
if (err) throw err;
else {
setValue(rows);
doCleverStuffWithData();
}
});
function doCleverStuffWithData() {
// Do something with result_arr
}