2017-07-06 85 views
0

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

在此先感谢大家。

+0

线程不会等待con.query完成。它会在执行con.query行后立即执行console.log(result_arr),这就是为什么没有记录任何值,因为con.query还没有完成查询。取消注释后,您会得到一个结果//console.log (rows);因为con.query完成了它的执行。将它视为con.query执行时,会创建一个新线程来运行它的执行,并且主线程将继续其生命,即使con.query尚未完成。 – suguspnk

+0

@suguspnk谢谢你的解释!我或多或少地理解它必须是这样的。你知道我该怎么做'setValues(rows);'在console.log(result_arr);'之前发生吗? – arocha

+0

请看dan的回答。这是正确的方法。 – suguspnk

回答

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); 
    } 
}); 

如果你想做的不仅仅是记录数据,那么你可以调用一个函数,这取决于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 
} 
+0

另外值得一提的是,可以将异步/等待功能添加到Node.js mysql模块[带有一些工作](https://github.com/mysqljs/mysql/issues/1755)。这也可以解决你的问题。希望对此的支持将在未来本地添加到mysql包中。 – dan

+0

你的解释是完美的,它按照我的意愿工作,我想我现在可以继续与thr项目。谢谢! – arocha

+0

@AntónioRocha太棒了,我真的很高兴它有帮助。 JavaScript中的异步/回调概念绝对值得让你的头在早期:) – dan

相关问题