Async.js系列和node-mysql查询不能得到行

我目前正在尝试使用async.js系列控制streamfunction来运行一组MySQL查询。 但我不断收到以下错误:

throw err; // Rethrow non-MySQL errors ^ TypeError: Cannot read property 'status' of undefined 

我已经在async.series之外testing了单独的函数中的查询,并且它们都很好,并将数据还给我,我可以认为这个错误的唯一原因是由于asynchronous性质,因此它当时没有数据当我logging我得到的行时的错误EG:

 [] [] [] 

以下是asynchronousfunction:

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

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

您错过了对async.series函数的主要callback函数。

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

你应该在主callback中调用connection.release() ,否则,在执行查询之前,MySQL连接将被释放/终止(由于代码的asynchronous性质)。

如果有用户定义的用户名称,它将工作。

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

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