web-dev-qa-db-ja.com

Node Mysqlはquitを呼び出した後にクエリをキューに登録できません

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はエンキューできません」のSOを検索してみましたが、見つかりませんでした。)

24
Kinjal Dixit

私はこの方法を使用してこの問題を修正しました。

connection.query関数のconnection.end()

修正されたコードは here

29
unlimited

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

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

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

10
matthewtole

たぶん問題は、Nodeの非同期性のために、接続がすでに閉じられた後に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}));

@Emil Condreaから適応したコード node.jsが終了する直前にクリーンアップアクションを実行

5
user3413723

私の場合、connection.endは気づきにくい場所で呼び出されていたため、connection.endへの誤った呼び出しがこのエラーの問題である可能性があります

1
Kyle Roux