2016-09-15 48 views
1

我目前正在尝试运行一组MySQL查询,以便使用async.js系列控制流功能。不过,我不断收到以下错误:Async.js系列和node-mysql查询无法获得行

throw err; // Rethrow non-MySQL errors 
     ^

TypeError: Cannot read property 'status' of undefined 

我已经测试过的查询在单独的功能async.series外,他们都很好,给我回的数据,我能想到的错误的唯一原因是由于在异步性质,它没有当时的数据,因此错误EG当我登录的行我得到:

[] 
[] 
[] 

下面是异步功能:

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(); 
    }); 
} 

任何suggestio ns作为错误的原因或在这里做错了什么?

+0

你尽力劝慰行?也许它没有导致那个错误的结果 – Beginner

+0

我现在可以尝试,我认为这是错误的原因,但有数据,它似乎在查询运行之前执行,如果我要猜测。 – Studento919

+0

我觉得不是因为你在回调函数 – Beginner

回答

1

您错过了主函数async.series的回调函数。

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(); 
      }); 
    }); 
} 

你应该叫connection.release()主要回调里面,否则,在执行之前的查询(由于异步特性的代码)MySQL连接将被释放/终止。

+0

发现那不是它似乎不能得到'[userval]'的意思它的null因此没有行....甚至是它的一个全球性的问题。 – Studento919

+0

你在哪里设置'userval'的值? –

+0

我经由socket.on设置它,并将其设置为全局变量here.'socket.on( 'sqluser',函数(userval){ \t \t用户= socket.id; \t \t userval = userval; \t \t SQLuserDataAsync(userval); \t});' – Studento919

0

如果有一个用户在userval中定义了名称,它将起作用。

但是,让我们简化了我们的代码:

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');