我正在测试ExpressJs,我遇到了问题。
var mysql = require('mysql');
var url = require('url');
var connection = mysql.createConnection({
host : 'localhost',
port : '8889',
user : 'root',
password : 'root',
database : 'test'
});
var results = '';
// INIT
exports.init = function(req, res) {
if (req.params.query == 'names') {
getByName(req, res);
} else {
res.send('Erreur');
}
}
getByName = function(req, res) {
currentUrl = url.parse(req.url);
getResult = req.params.suffix.split('+');
for (key in getResult) {
connection.query('SELECT * from testnode WHERE nom = "'+getResult[key]+'"', function(err, rows, fields) {
if (err) throw err;
results += JSON.stringify(rows[0]);
console.log(results);
});
}
res.render('api', {'results' : results});
}
当我第一次在页面上移动时,这个是空的,如果我刷新结果,那么
我不知道为什么第一次变量“results”为空,所以console.log给了我很好的结果。
你有什么想法吗?
非常感谢:)
答案 0 :(得分:0)
您的错误来自循环和回调的混合。 Node.js是一个非阻塞的IO库:进程不等待你的mysql查询完成继续做其他的事情,所以在渲染之后执行带有结果的回调(某些时候)。
您有多个选项,我使用的选项是https://github.com/caolan/async,或者在完成所有回调后调用render
。
或者改变你的策略:
getByName = function(req, res) {
currentUrl = url.parse(req.url);
getResult = req.params.suffix.split('+');
connection.query('SELECT * from testnode WHERE nom IN ("' + getResult.join('",") + '")', function(err, rows, fields) {
if (err) throw err;
var results = JSON.stringify(rows); //get all the results
res.render('api', {'results' : results});
});
}