2011-06-29 5 views
2

node.jsアプリケーションにはnode_msyqlというMySQLデータベースにアクセスするための小さなライブラリがあります。node.js/node_mysql - 無効な接続で「データベースが選択されていません」というエラーが表示される

残念ながら、私たちの接続が多分8-10時間使用されない場合、次回にクエリを実行しようとすると、サーバから"No database selected"エラーが返されます。どこかで"USE db"を追加する必要がありますが、どこにあるのかわかりません。

接続が古くなり、node_mysqlが古い接続をリフレッシュしているように見えますが、正しいdbが接続されているかどうかを確認する方法がないようです。私は.connected()コールバックまたはイベントか、正しいDBが常にUSEのdであったことを確認できるものを探していましたが、これまでの運はありませんでした。

どのようにすればいいですか?

答えて

3

クライアントは、再接続を試みます。あなたはこのようなコードを使用して再接続時に「使用デシベル」を照会しようとすることができます: https://github.com/felixge/node-mysql/blob/master/lib/mysql/client.js

var connection = self._connection = new Stream(), 
    parser = self._parser = new Parser(); 

connection 
    .on('error', function(err) { 
    var connectionError = err.code && err.code.match(/ECONNREFUSED|ENOTFOUND/); 
    if (connectionError) { 
     if (cb) { 
     cb(err); 
     return; 
     } 
    } 

    self.emit('error', err); 
    }) 
    .on('data', function(b) { 
    parser.write(b); 
    }) 
    .on('end', function() { 
    if (self.ending) { 
     self.connected = false; 
     self.ending = false; 
     return; 
    } 

    if (!self.connected) { 
     return; 
    } 

    self.connected = false; 
    self._prequeue(connect); 
    }); 
connection.connect(self.port, self.host); 
+0

この回答は機能します。もう1つの答えは、問題を完全に回避し、クライアントオブジェクトにデータベースを設定するだけです。再接続すると、 'useDatabase'が実行されます。P – MarcWan

+0

ドライバを変更してください:MySQLの認証ハンドシェイクでデータベースを組み込むことができます。他のドライバ(my-https://github.com/sidorares/nodejs-mysql-nativeを含む)は、ハンドシェイク中に存在する場合、データベースを使用します。現在、私のドライバは接続の切断に再接続しようとしませんが、実装しようとしています。 –

+0

また、私の解決策に問題があることに注意してください:self._prequeue(connect);コマンドキューの先頭にauthコマンドを挿入し、キューの最後にクエリ( 'use db')を追加します。キューに登録されている他のコマンドは失敗することがあります。 –

0

理由:再接続がノード-mysqlの(「終了」ハンドラ)で起こるところ

client._connection.on('connect', function() { client.query('use db'); }) 

これは、ノード-mysqlの更新次のコードで多分仕事:

client._socket.on('connect', function() { 
    console.log("use ",DB_NAME); 
    client.query('use '+DB_NAME); 
}); 
+0

node-mysqlパッケージのアップデート(現在は2.5)のため、正しいイベント名はありません"接続する"が、 "接続" – BartoszK

0

the node-mysql-promise packageを使用して、あなたが同じことを行うには、このコードを使用することもできます。

dbConn.pool.on('connection', function() { 
    dbConn.pool.query("USE myDBname"); 
}); 
関連する問題