2016-09-15 46 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');