将 mysql 查询行存储在变量中供以后使用

Store mysql query rows in variable for later use

我正在做一个监控系统项目,其中我将 Arduino 传感器数据发送到 node.js 服务器(通过 GET 请求),然后存储在 MySQL 数据库中。

每当我成功向服务器发送数据时,它会连接到 MySQL 数据库并查询最近收到的 5 条记录以进行一些处理。

因此,我需要将这5条记录的行存储在一个变量中以备后用。这意味着我必须从变量中的 connection.query 中获取行。

我读到我不能这样做是因为 node.js 是异步的。所以我的问题是:

  1. 是否可以按照我尝试的方式完成描述的任务?
  2. 如果不行,还有其他方法吗?

我没有将整个代码放在这里,但我运行进行了一个单独的测试,该测试也没有 运行 正确。这是:

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
}