32

現在使用中: 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再接続できないことを意味しますか?

4

2 に答える 2

33

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

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

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

https://github.com/felixge/node-mysql/blob/master/Readme.md#エラー処理

// I am Chuck Norris:
connection.on('error', function() {});

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

ここで確認してください。切断後に再び接続していることを示しています。

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

于 2012-11-07T09:02:31.320 に答える
3

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

于 2013-12-26T00:30:27.390 に答える