2013-01-15 11 views
18

mysql接続をどこで終了しますか?ノードMysqlはquitを呼び出した後でクエリをエンキューできません

クエリを順番に実行する必要があります。私は、現時点では、このようなコード書いています:

var sqlFindMobile = "select * from user_mobiles where mobile=?"; 
var sqlNewUser = "insert into users (password) values (?)"; 
//var sqlUserId = "select last_insert_id() as user_id"; 
var sqlNewMobile = "insert into user_mobiles (user_id, mobile) values (?,?)"; 
connection.connect(function(err){}); 
var query = connection.query(sqlFindMobile, [req.body.mobile], function(err, results) { 
    if(err) throw err; 
    console.log("mobile query"); 
    if(results.length==0) { 
     var query = connection.query(sqlNewUser, [req.body.password], function(err, results) { 
      if(err) throw err; 
      console.log("added user"); 
      var user_id = results.insertId; 
      var query = connection.query(sqlNewMobile, [user_id, req.body.mobile], function(err, results) { 
       if(err) throw err; 
       console.log("added mobile"); 
        //connection.end(); 
       }); 
     }); 
    } 
}); 
//connection.end(); 

を(私はノード、NPM-ExpressとNPM-mysqlので初心者です、私は関連の質問を見つけるために、「MySQLがエンキューすることはできません表現」のためにSOを検索しようとしています。あなたはfelixgeによりノード-mysqlのモジュールを使用している場合は、connection.queryのすべてを行った後、それらを発見していない。)

答えて

10

あなたはどの時点でconnection.end()を呼び出すことができます()コールは、接続を終了する前にすべてのクエリが終了するのを待機するためです。

詳細については、example hereを参照してください。

多くのクエリを連続して実行する場合は、async moduleを調べると、一連の非同期関数(コールバックを持つ関数など)を処理するのに最適です。

+0

"added mobile"ログの後にコメントアウトされているconnection.end()を呼び出しています。私が感知している問題は、フローが、すなわちスロー(err)ポイントのいずれかに存在する場合、接続が閉じられないということです。私は虚偽の接続ミスとそのスケーラビリティへの影響をオープンなままにしている接続を痛感しています。私はちょうど私の人生のこの時点でそれをしたくないです。あなたがこれに従うことができるパターンを持っているなら、それは素晴らしいでしょう。非同期は良い呼び出しのようです。私はそれをチェックし、それに応答するために1日かかるだろう。ありがとう。 –

+0

すぐに話すと、これらのクエリはネストされていて、シリーズで実行する必要があるものではないため、asyncは私のためには機能しません。状態を維持し、前提条件をチェックすることは、あまりにも多くのオーバーヘッドです。 –

+0

waterfall関数を使用してクエリを実行できます。私は基本的な構造をここに書きました:http://pastebin.com/RDaiqZsp – matthewtole

24

この問題をこの方法で解決しました。

あなたconnection.query機能でconnection.end()

固定コードがhere

+1

NodeJSはデータベース呼び出しを実行する前に 'connection.end()'を非同期にするので起動します。 – Eranda

4

たぶん問題は、接続がすでにクローズされた後、MySQLのクエリが起因して、実行されていることですノードの非同期性。 connection.endを呼び出すために、このコードを使用してみてください()右のスレッドが終了する前に:

function exitHandler(options, err) { 
    connection.end(); 
    if (options.cleanup) 
     console.log('clean'); 
    if (err) 
     console.log(err.stack); 
    if (options.exit) 
     process.exit(); 
} 

//do something when app is closing 
process.on('exit', exitHandler.bind(null, {cleanup: true})); 

コードは、私の場合のconnection.endでdoing a cleanup action just before node.js exits

1

だった場所に呼ばれていた、@Emil Condreaから適応気付きにくいので、connection.endへの間違った呼び出しがこのエラーの問題である可能性があります。

関連する問題