2016-09-15 3 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:

以下
[] 
[] 
[] 

は、非同期関数ですエラーの理由または何がここで間違っていますか?

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

あなたは(コードによる非同期性のために)クエリが実行される前に、それ以外の場合は、MySQLの接続が終了/リリースされる、主なコールバック内connection.release()を呼び出す必要があります。

+0

発見されたことは問題ではなく、 '[userval]'はそのヌルを意味し、したがって行がないことを意味しません。 – Studento919

+0

'userval'の値はどこで設定していますか? –

+0

Iは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'); 
関連する問題