Javascript NodeJS函数执行命令

Javascript NodeJS函数执行命令,javascript,mysql,node.js,Javascript,Mysql,Node.js,只需启动学习节点并尝试构建应用程序 现在在我的路由文件中,我试图连接到mysql,获取用户的主要信息,然后用它做其他事情。但是,当我执行网页时,控制台显示第二个日志的执行时间早于第一个日志。我想这可能是因为节点是异步的 exports.list = function(req, res){ req.getConnection(function(err,connection){ /* find user's major */ var user_major = (function() {

只需启动学习节点并尝试构建应用程序

现在在我的路由文件中,我试图连接到mysql,获取用户的主要信息,然后用它做其他事情。但是,当我执行网页时,控制台显示第二个日志的执行时间早于第一个日志。我想这可能是因为节点是异步的

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

您正面临这个问题,因为当调用堆栈到达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);
            });
        })();

        });
    };

正如其他人在评论中指出的,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
            });
        });

    });
};

没错,这是因为它是异步的。你曾经使用过ajax吗?这是一个类似的想法。你需要了解异步编程是如何工作的<首先执行代码>外部测试。如果您想让异步代码更容易编写,请签出。我知道您只是在重新编写OP的代码,但这应该是检查
req.getConnection()
回调中是否发生错误。@MattBrowne我不希望OP复制并粘贴我的示例到生产代码中,但我还是添加了它。谢谢:)谢谢大家!!我花了几个小时研究异步的概念。这真的很棘手,但现在我有点明白了。谢谢你的回答!我喜欢你命名db函数的方式。非常有用=)