3

データベースに接続して接続を管理するdatabase.jsファイルがあります接続をエクスポートしてアプリで再利用します

    var mysql = require('mysql');

    pool = mysql.createPool({
        host: cfg.mysql.host,
        user: cfg.mysql.user,
        password: cfg.mysql.pass,
        database: cfg.mysql.db,
        port: cfg.mysql.port
    });


    function handleDisconnect() {
    pool.getConnection(function(err, cnt) {
    module.exports.connection = cnt;
    });

    pool.on('error', function (err) {
      console.log(err);
    });
    };

    handleDisconnect();
    process.on('uncaughtException', function (err) {
      console.error(err.code);
    if(err.code === "PROTOCOL_CONNECTION_LOST")
    handleDisconnect();
      console.log("Node NOT Exiting...");
    });

app.js

    var db = require('./database');
     app.get('/test', function(req, res) {
        db.connection.query('SELECT * from table', function(err, result) {
           console.log(result);
          });
        }

これはうまくいきます。私の問題は、mysql サーバーが切断されたときです。このエラーを処理するには、handleDisconnect() 関数を呼び出して新しい接続を取得します。ただし、その場合、ブラウザ/testに移動すると、app.jsで接続が定義されていません

TypeError: Cannot call method 'query' of undefined

考え?

4

3 に答える 3

0

チェックインから開始するとpool.getConnectionエラーhandleDisconnectがスローされます。接続が失われた場合に備えて再接続する前にタイムアウトを組み込んでいないpool.getConnectionため、同じ問題のためにすぐに呼び出しが失敗する可能性があります。

また、接続が失われてからhandleDisconnect再接続するまでの間に、着信 HTTP 要求はデータベース クエリを実行できないためdb.connection、クエリを実行する前に実際に有効かどうかを確認する必要があります。

または、Express ルートでもエラーを処理する必要があります。たとえば、エラー ハンドラ ルート (ルート/ミドルウェア セットアップの最後に配置する必要があります) を使用します。

// middleware setup
...
// routes setup
...
// finally:
app.use(function(err, req, res, next) {
  res.send(500, err.message); // or whatever you want to send back in case of errors.
});
于 2013-10-26T12:55:14.210 に答える