NodeJS函数执行命令

时间:2014-10-31 11:15:59

标签: javascript mysql node.js

开始学习Node并尝试构建应用程序。

现在我的路径文件中我正在尝试连接到mysql并获取用户的主要部分,然后用它来做其他事情。但是,当我执行网页时,控制台显示第二个日志的执行时间早于第一个日志。我想这可能是因为Node是Async?

exports.list = function(req, res){
req.getConnection(function(err,connection){
   /* find user's major */
    var user_major = (function() {
        connection.query('SELECT major FROM user WHERE user_id=' + req.params.id, function (err, row) {
            if (err) {
                console.log("Error Selecting : %s ", err);
            }
            console.log('Test inside function: '+ row[0].major);
            return row[0].major;
        });
    })();
    console.log("Test outside: " + user_major);

    res.render('main/main',{page_title:'USER MAJOR', data: user_major});
    });
};

终端日志:

Test outside: undefined
GET /main/1 304 353.737 ms - -
Test inside function: COEN

2 个答案:

答案 0 :(得分:3)

正如其他人在评论中指出的那样,Node.js是异步的。您不能只从函数返回数据,它必须在回调中返回。

我按如下方式重写:

exports.list = function(req, res, next) {
    req.getConnection(function(err, connection) {
        if (err) return next(err);
            /* find user's major */
        var user_major = function(id, callback) {
            connection.query('SELECT major FROM user WHERE user_id=' + id, function(err, row) {
                if (err) {
                    return callback("Error Selecting : %s ", err);
                }
                callback(null, row[0].major);
            });
        };

        user_major(req.params.id, function(error, major) {
            if (error) return next(error);
            res.render('main/main', {
                page_title: 'USER MAJOR',
                data: major
            });
        });

    });
};

答案 1 :(得分:-1)

您遇到了问题,因为当调用堆栈到达console.log时,该值尚未返回,因为节点js是异步的。回调用于回调带有异步函数结果的回调函数。

    exports.list = function(req, res){
    req.getConnection(function(err,connection){
       /* find user's major */

      var callback = function(user_major){
     console.log("1 Test outside: " + user_major);
     res.render('main/main',{page_title:'USER MAJOR', data: user_major});
     }

        var db_call_for_user_major = (function(callback) { 
            connection.query('SELECT major FROM user WHERE user_id=' + req.params.id, function (err, row) {
                if (err) {
                    console.log("Error Selecting : %s ", err);
                }
                console.log('test inside function: '+ row[0].major);
                return callback(row[0].major);
            });
        })();

        });
    };