这是第一次使用node js,所以这个问题可能是非常基本的问题。我尝试使用回调方法,而不仅仅是返回值,但是我无法解决问题。
我听说在节点js中的其他代码之后执行mysql查询。 但是我想将查询(如果有条件的话)放在代码的中间,并在执行下面的查询代码之前检查条件。
我正在做IoT事情(传感器+ android应用+带有nodejs的AWS ubuntu服务器,并使用mysql作为数据库) 我想在将数据添加到服务器数据库之前检查传感器是否工作正常。 因此,在将数据存储到数据库之前,我放置了代码以检查传感器是否工作正常。(通过比较两个传感器的结果进行检查。)
但是问题是mysql查询(检查传感器是否正确)的执行时间晚于node.js中的其他代码,因此我无法在中间检查条件。 如何在代码中间运行条件查询并返回任何条件值?
app.get('/log', function(req, res){
r = req.query;
result_error = error_check(r.nickname);
console.log("error check result"+result_error);
insert_temp(r.nickname,r.left_num,r.right_num);
//this function is called after error_check function, but when I saw the result, console.log in this function is called earlier than error_check function
res.end('OK:' + JSON.stringify(req.query));
});
function error_check(nickname){
var sql = mysql.format('select sum(left_num) as left_sum, sum(right_num) as right_sum from temp where nickname = ? and today_date = date(current_date());',nickname);
var query = connection.query(sql,function(err,result){
if (err) throw err;
console.log("Error check/// left_sum is "+result[0].left_sum + " right_sum is "+result[0].right_sum);
if ((result[0].left_sum - result[0].right_sum >=30 )|| (result[0].right_sum - result[0].left_sum >=30 )){
console.log("Sensor is broken");
return 1;
}
else{
return -1;
}
});
console.log(query);
}
/////////////////////////////but the result is
error check result undefined
(this is from insert_temp function! )nickname is ? left_num is ? right_num is ? gucheol 0 1
(this is from error_check function! this function is called before inset_temp function. error_check function is executed late...so I cannot check if sensor is wrong )
Error check/// left_sum is 0 right_sum is 45
Sensor is broken
///但是如果我们从console /////
看到结果错误检查结果未定义
(这是来自insert_temp函数!)昵称是? left_num是吗? right_num是? gucheol 0 1
错误检查/// left_sum为0 right_sum为45 传感器坏了
(这是来自error_check函数!此函数在insert_temp函数之前被调用。error_check函数执行得较晚...因此我无法检查传感器是否错误)
答案 0 :(得分:0)
connection.query
是一个异步函数,因此将在事件循环结束时执行。
您可以使用asynchronous
的{{1}}方式使用synchronous
的即时方式。
您可以使用如下所示的代码来工作,
util.promisify()