我仍然是nodejs和Javascript的新手,如果我的问题看起来很简单,我很抱歉,但我很挣扎,我似乎无法在网上找到答案。
我想要做的是基本上调用一个脚本(sqlRequest.js)并在调用它时发送一个整数。该脚本将向我的数据库发送一个sql请求,并将结果(一个对象)返回到原始文件。
以下是代码:
router.post('/request', function(req, res, next){
var id = req.body.id;
var essai = require('./sqlRequest.js');
console.log("INDEX: "+essai.sendSQL(id)); });
现在是sqlRequest.js代码:
exports.sendSQL = function(id) {
var mysql= require('mysql');
var connection = mysql.createConnection({
host : 'localhost',
user : 'bcombes',
password : 'bertrand1994',
database : 'totalkpi'
});
connection.connect();
var sql ="SELECT * FROM tra_ticket where id=?";
var insert=[id];
sql=mysql.format(sql, insert);
connection.query(sql, function(err, rows, fields) {
if (err) {
console.log('Error while performing Query.');
connection.end();
}
else {
connection.end();
console.log(rows);
return rows;
}
});};
在控制台上我可以看到console.log(" INDEX:" + essai.sendSQL(id));似乎未定义,并显示在console.log(行)之前。
服务器是否有可能不等待函数完成并显示变量?
无论如何,谢谢你抽出时间帮忙。
答案 0 :(得分:0)
你在文件之间传递变量的逻辑很好。您看到essai.sendSQL(id)
返回undefined
的原因是因为connection.query(...)
是异步调用的,正如您在问题中提到的那样,console.log
会在数据库查询完成之前触发。< / p>
要解决该问题,您只需稍微重构一下代码:
var essai = require('./sqlRequest.js');
router.post('/request', function(req, res, next){
var id = req.body.id;
// send callback to sendSQL
essai.sendSQL(id, function(index) {
// this will only fire once the callback has been called
console.log("INDEX: " + index)
})
});
然后在sqlRequest.js中:
exports.sendSQL = function (id, cb) {
var mysql = require('mysql');
var connection = mysql.createConnection({
host: 'localhost',
user: 'bcombes',
password: 'bertrand1994',
database: 'totalkpi'
});
connection.connect();
var sql = "SELECT * FROM tra_ticket where id=?";
var insert = [id];
sql = mysql.format(sql, insert);
connection.query(sql, function (err, rows, fields) {
if (err) {
console.log('Error while performing Query.');
connection.end();
}
else {
connection.end();
console.log(rows);
// call the callback
cb(rows);
}
});
};