27

mysql接続をどこで閉じるのですか?

クエリを順番に実行する必要があります。現在、次のようなコードを書いています。

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 の初心者です。関連する質問を見つけるために「express mysql cannot enqueue」で SO を検索しようとしましたが、見つかりませんでした。)

4

4 に答える 4

34

この方法を使用してこの問題を修正しました:

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

固定コードはhere

于 2013-03-07T09:11:45.927 に答える
11

felixgeによるnode-mysqlモジュールを使用している場合は、すべてのクエリが終了するまで待機するため、すべての connection.query() 呼び出しを行った後、いつでも connection.end() を呼び出すことができます。接続を終了する前に。

詳細については、こちらの例を参照してください。

一連のクエリを連続して実行したい場合は、asyncモジュールを調べる必要があります。これは、一連の非同期関数 (つまり、コールバックを持つ関数) を処理するのに最適です。

于 2013-01-15T11:47:11.713 に答える
5

おそらく問題は、Node.js の非同期性のために、接続が既に閉じられた後に 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}));

node.js が終了する直前にクリーンアップ アクションを実行する、 @Emil Condrea から改作されたコード

于 2015-07-16T13:03:34.023 に答える