NodeJS:如何在MySQL创建操作完成之前停止代码执行

时间:2016-09-08 10:25:46

标签: mysql node.js synchronous

我有一个非常基本的场景,我正在NodeJS应用程序中对MySQL进行创建操作调用。一旦我得到创建操作的结果(成功或失败),我就必须执行一些代码。

但现在由于NodeJS的异步行为,我的代码依赖于结果MySQL创建操作在MySQL创建操作发送结果之前执行。

这是我的代码

  1. calculation.js

    var mysql = require("mysql");
    var methods = {};
    
    // Creating connection
    methods.executeQuery = function(selectQuery, values){
    
    var result;
    
    var con = mysql.createConnection({
        host: "localhost",
        user: "root",
        password: "*********",
        database: "******"
    });
    
    // getting connection
    con.connect(function(err){
        if(err){
            console.log('Error connecting to Db');
            return;
        }
        console.log('Connection established');
    });
    
    con.query(selectQuery, values, function(err,rows){
        if(err) throw err;
        console.log(rows);
        result = rows;
        console.log(result);
        return result;
    });
    
    }
    
    module.exports = methods;
    
  2. client.js

    var execute = require("./calculate.js");
    
    var selectQuery = 'INSERT INTO users (username,password) VALUES (?,?)';
    var values = ['sohamsoham12','sohamsoham12'];
    
    var insertedRowInfo = execute.executeQuery(selectQuery, values);
    
    if(insertedRowInfo){
        console.log("true");
    }else{
        console.log("false");
    }
    

1 个答案:

答案 0 :(得分:0)

我不知道我是否正确理解了您的问题(例如"创建操作"是什么?)。但是......
您可以尝试此解决方案:在connect success callback中执行查询:

// getting connection and executing query
con.connect(function(err){
    if(err){
        console.log('Error connecting to Db');
        return;
    }
    console.log('Connection established');

    con.query(selectQuery, values, function(err,rows){
        if(err) throw err;
        console.log(rows);
        result = rows;
        console.log(result);
        return result; // this can't work... you should invoke a callback function, here...
    });
});

<强>更新: OP评论后,我现在完全理解了这个问题......(对不起:-()。
你只是错过了一些异步行为......: - )

您只需从

更改methods.executeQuery即可
function(selectQuery, values) {
  ...
}

function(selectQuery, values, callback) {
  ...
}

然后,改为使用

return result;

您应该只使用

callback(err, result); // if any error occurred

callback(null, result); // if no error occurred

然后,在client.js中,在调用executeQuery方法时,而不是

var insertedRowInfo = execute.executeQuery(selectQuery, values);

你应该只做

execute.executeQuery(selectQuery, values, function(err, insertedRowInfo) {
  if (err) {
    // handle error
  } else {
    // handle success, using insertedRowInfo...
  }
});