首页 > 解决方案 > 如何在nodejs中首先实现mysql查询?(或者先实现条件查询)

问题描述

这是第一次使用node js所以这个问题可以是非常基本的问题。我尝试使用回调而不是仅返回值,但我无法解决问题。

听说mysql查询是在node js中的其他代码之后执行的。 但我想将(如果条件)查询放在代码中间,并在执行查询下面的代码之前检查条件。

我正在做物联网的事情(传感器 + android 应用程序 + aws ubuntu 服务器和 nodejs 并使用 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

///但是如果我们从控制台看到结果/////

错误检查结果未定义

(这是来自 insert_temp 函数!)昵称是?left_num 是 ? right_num 是?九铁 0 1

错误检查/// left_sum 为 0 right_sum 为 45 传感器损坏

(这是来自 error_check 函数!此函数在 insert_temp 函数之前调用。error_check 函数执行较晚......所以我无法检查传感器是否错误)

标签: javascriptmysqlnode.js

解决方案


connection.query 是一个异步函数,因此将在事件循环结束时执行。asynchronous您可以使用方式的即时synchronous方式 using util.promisify()

您可以像下面这样使用您的代码,

app.get('/log', function(req, res){
        r = req.query;

        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());',r.nickname);
        var query = connection.query(sql,function(err,result){
                if (err) throw err;
                if ((result[0].left_sum - result[0].right_sum >=30 )|| (result[0].right_sum - result[0].left_sum >=30 )){
                        console.log("Sensor is broken");
                        res.end("NOT OK: Sensor is broken");
                }
                else{
                        insert_temp(r.nickname,r.left_num,r.right_num);
                        res.end('OK:' + JSON.stringify(req.query));
                }
        });
});
  • 如果此代码出现错误,请告诉我。

推荐阅读