【问题标题】:Store mysql query rows in variable for later use将mysql查询行存储在变量中以备后用
【发布时间】:2017-12-10 05:48:58
【问题描述】:

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

每当我成功向服务器发送数据时,它都会连接到 MySQL DB 并查询最近收到的 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 完成。它会在执行 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


【解决方案1】:

您看到这种行为是因为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
}

【讨论】:

  • 另外值得一提的是,可以在 Node.js mysql 模块with a bit of work 中添加 async/await 功能。这也可以解决您的问题。希望将来会在 mysql 包中添加对此的支持。
  • 你的解释很完美,它按我的意愿工作,我想我现在可以继续这个项目了。谢谢!
  • @AntónioRocha 太好了,我很高兴它有帮助。 JavaScript 中的异步/回调概念绝对值得您尽早了解:)
  • @dan 我正在尝试在 doCleverStuffWithData() 函数中返回 result_arr,但我仍然收到“Promise Pending”消息。有什么想法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-06
  • 1970-01-01
  • 1970-01-01
  • 2015-08-07
  • 1970-01-01
相关资源
最近更新 更多