Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Async.js系列和节点mysql查询';我们不能吵架_Javascript_Node.js_Asynchronous_Node Mysql_Async.js - Fatal编程技术网

Javascript Async.js系列和节点mysql查询';我们不能吵架

Javascript Async.js系列和节点mysql查询';我们不能吵架,javascript,node.js,asynchronous,node-mysql,async.js,Javascript,Node.js,Asynchronous,Node Mysql,Async.js,我目前正在尝试使用async.js系列控制流函数按顺序运行一组MySQL查询。但我一直收到以下错误: throw err; // Rethrow non-MySQL errors ^ TypeError: Cannot read property 'status' of undefined 我已经在async.series之外的单独函数中测试了查询,它们很好,并返回了数据,我认为错误的唯一原因是由于异步性质,当时它没有数据,因此出现错误,例如,当我记录我得到的行时: [] [

我目前正在尝试使用async.js系列控制流函数按顺序运行一组MySQL查询。但我一直收到以下错误:

throw err; // Rethrow non-MySQL errors
        ^

TypeError: Cannot read property 'status' of undefined
我已经在async.series之外的单独函数中测试了查询,它们很好,并返回了数据,我认为错误的唯一原因是由于异步性质,当时它没有数据,因此出现错误,例如,当我记录我得到的行时:

[]
[]
[]
下面是异步函数:

 function SQLuserDataAsync() {
    connection.getConnection(function (err, connection) {
        async.series([
                function (callback) {
                    connection.query('SELECT status FROM users WHERE name= ?;',
                        [userval],
                        function (err, rows) {
                        if (rows[0]['status']) {
                            console.log("Account Status: " + accountval);
                        } else {
                            console.log(err);
                        }
                        callback(null, 'one');
                    });
                },
                function (callback) {
                    connection.query('SELECT account_type FROM settings_tbl WHERE id=(SELECT id FROM users WHERE name= ?);',
                        [userval],
                        function (err, rows) {
                        if (rows[0]['account_type']) {
                            var acctype = rows[0]['account_type'];
                            console.log("Account Type: " + acctype);
                        } else {
                            console.log(err);
                        }
                        callback(null, 'two');
                    });
                },
                function (callback) {
                    connection.query('SELECT type FROM settings_tbl WHERE id=(SELECT id FROM users WHERE name= ?);',
                        [userval],
                        function (err, rows) {
                        if (rows[0]['type']) {
                            var type = rows[0]['type'];
                            console.log("Type: " + type);
                        } else {
                            console.log(err);
                        }
                        callback(null, 'three');
                    });
                }
            ]);
        connection.release();
    });
}

有什么建议可以作为错误的原因,或者我在这里做错了什么?

您错过了函数的主回调函数

function SQLuserDataAsync() {
    connection.getConnection(function (err, connection) {
        async.series([
                function (callback) {
                    // YOUR CODE
                },
                function (callback) {
                    // YOUR CODE
                },
                function (callback) {
                    // YOUR CODE
                }
            ], function(error, results) { // <--- this is the main callback
                connection.release();
            });
    });
}
函数SQLuserDataAsync(){ getConnection(函数(err,connection){ 异步系列([ 函数(回调){ //你的代码 }, 函数(回调){ //你的代码 }, 函数(回调){ //你的代码 }
],函数(错误,结果){/如果有一个在
userval
name中定义的用户,它将工作

但让我们简化代码:

function SQLuserDataAsync(userval) {

    connection.getConnection(function (err, connection) {
        async.waterfall([

                // getting user
                function (next) {
                    connection.query(
                        'SELECT * FROM users WHERE name = ? LIMIT 1',
                        [userval],
                        function (err, result) {
                          next(err, result[0]); // passing user to next function
                        });
                },

                // getting settings of user, maybe user_id (not id) in query below
                function (user, next) {
                    connection.query(
                        'SELECT * FROM settings_tbl WHERE id = ? LIMIT 1',
                        [user.id],
                        function (err, result) {
                          next(err, user, result[0]);
                        });
                },

                // handling both user and settings
                function (user, settings, next) {
                  console.log('User: ', user);
                  console.log('Settings: ', settings);
                  connection.release();
                }
            ]);
    });
}

SQLuserDataAsync('someone');

你试着去控制行了吗?可能没有导致错误的结果我现在可以试一下,我相信这就是错误的原因,但是那里有数据,如果我猜的话,它似乎是在查询运行之前执行的。我想不是因为你在回调函数中,可能是wrap is dataValues?行是空的,但是如果我在异步系列之外的单独函数中运行查询,它会工作。发现这不是问题,它似乎无法获取
[userval]
,这意味着它为空,因此没有行…即使是全局的。
userval
的值在哪里设置?我通过socket.on设置它,并在这里将其设置为全局变量。
socket.on('sqluser',function(userval){users=socket.id;userval=userval;SQLuserDataAsync(userval);})
可能事件没有被触发。或者,语句
userval=userval;
没有将本地
userval
的值分配给全局
userval
。因此它保持为null。事件触发函数,函数调用时预期值在那里。我在函数启动之前记录了它异步系列