web-dev-qa-db-ja.com

node-mysqlを使用してMySQL接続を閉じるのはいつですか?

現在使用中: https://github.com/felixge/node-mysql

私は次のコードを持っています:

_var connection = mysql.createConnection({
    Host     : 'localhost',
    user     : 'me',
    password : 'secret',
    database : 'Database1'
});
app.put('/api/upload', function(req, res, next)
{
    connection.connect();
    doMultipleQueries(function(err)
    {
        connection.end();
    });          
};
_

Putリクエストは完全に正常に機能しますが、2回目に呼び出すと、次のエラーが表示されます

_events.js:68
        throw arguments[1]; // Unhandled 'error' event
                       ^
Error: Cannot enqueue Handshake after invoking quit.
    at Protocol._validateEnqueue (/Users/anon/Desktop/project Web/node_modules/mysql/lib/protocol/Protocol.js:110:16)
_

サーバーが死ぬまで接続を開いたままにしておくべきですか?

更新:_mysql.createConnection_をput要求関数に次のように移動すると:

_var connection = null; 
app.put('/api/upload', function(req, res, next)
{
    connection = mysql.createConnection({
        Host     : 'localhost',
        user     : 'me',
        password : 'secret',
        database : 'Database1'
    });
    connection.connect();
    doMultipleQueries(function(err)
    {
        connection.end();
    });          
};
_

正常に動作します。これは、connection.end()が_mysql.createConnection_が作成したものを閉じ、再接続できないことを意味しますか?

26
ninjaneer

connection.end() は、致命的なエラーに関係なくジョブを実行します。 COM_QUITパケットを送信する前に致命的なエラーが発生した場合、err引数がコールバックに提供されますが、それにもかかわらず接続は終了します。

destroy()メソッド も確認してください。これにより、基礎となるソケットが即座に終了します。

エラーハンドラを追加できます。

https://github.com/felixge/node-mysql/blob/master/Readme.md#error-handling

connection.on('error', function() {});

いったん終了すると、既存の接続オブジェクトは設計により再接続できません。

こちらをご覧ください。切断後に接続し直していることを示しています。

https://github.com/felixge/node-mysql/blob/master/Readme.md#server-disconnects

適切な方法は、起動時にアプリの接続を取得し、アプリが終了したときにend()するだけだと思います。

3
Chris