我有一个非常基本的场景,我正在NodeJS应用程序中对MySQL进行创建操作调用。一旦我得到创建操作的结果(成功或失败),我就必须执行一些代码。
但现在由于NodeJS的异步行为,我的代码依赖于结果MySQL创建操作在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");
}
答案 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...
}
});