ExpressJs在动作后呈现

时间:2014-02-16 17:34:37

标签: mysql node.js express

我正在测试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给了我很好的结果。

你有什么想法吗?

非常感谢:)

1 个答案:

答案 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});
        });
}