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

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

这是我的代码


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;

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

最佳答案

我不知道我是否正确理解您的问题(例如,“创建操作”是什么?)。但...
您可以尝试以下解决方案:在连接成功回调中执行查询:

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

10-08 03:49