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

时间:2017-07-06 09:38:18

标签: mysql node.js node-mysql

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

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

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

我读到我无法做到这一点的事实是因为node.js是异步的。所以我的问题是:

  1. 是否可以按照我正在尝试的方式完成所描述的任务?
  2. 如果没有,还有其他办法吗?
  3. 我没有把整个代码放在这里,但是我正在运行一个也无法正常运行的独立测试。这是:

    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中的内容。

    提前感谢所有人。

1 个答案:

答案 0 :(得分:2)

您会看到此行为,因为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);
  }
});

如果您想做的不仅仅是记录数据,那么您可以调用一个取决于result_arr回调con.query的函数,如下所示:

con.query(queryString, function (err, rows, fields) {
  if (err) throw err;
  else {
    setValue(rows);
    doCleverStuffWithData();
  }
});

function doCleverStuffWithData() {
    // Do something with result_arr
}