2017-08-24 2 views
0

JS可変スコープの問題であると推測して固定しているように見える、mysql接続エラーが発生しました。Hapi JSルートハンドラ内のJS可変スコープ

私は、次のMySQLエラーをスローしていたコードをコメントアウトしました:PROTOCOL_ENQUEUE_AFTER_FATAL_ERROR、および以下の作業コードが含まれています。

require('dotenv').config(); 
const Hapi = require('hapi'); 
const mysql = require('mysql'); 
const Joi = require('joi'); 
const query = require('./lib/mysql/query'); 

const server = new Hapi.Server(); 
server.connection({ 
    host: process.env.SERVER_HOST, 
    port: process.env.SERVER_PORT 
}); 

const dbOne = mysql.createConnection({ 
    host: process.env.DB_HOST, 
    user: process.env.DB_USER_ONE, 
    password: process.env.DB_PASSWORD_ONE 
}); 
const dbTwo = mysql.createConnection({ 
    host: process.env.DB_HOST_TEST, 
    user: process.env.DB_USER_TWO, 
    password: process.env.DB_PASSWORD_TWO, 
}); 

server.route({ 
    method: 'GET', 
    path:'/my-route', 
    config: { 
    validate: { 
     query: { 
     useDatabase2: Joi.valid('true'), 
     }, 
    }, 
    }, 
    handler: (req, reply) => { 
    const useDatabase2 = req.query.useDatabase2 === 'true'; 

    // This didn't work... 
    /* 
    const db = useDatabase2 ? dbTwo : dbOne; 
    db.query(query, (err, rows) => { 
     if (err) { 
     reply({ 
      statusCode: 500, 
      error: "Internal Server Error", 
      message: err, 
     }).code(500); 
     } else { 
     // ...do something with the data 
     } 
    }); 
    */ 

    // This works... 
    if (useDatabase2) { 
     dbTwo.query(query, (err, rows) => { 
     if (err) { 
      reply({ 
      statusCode: 500, 
      error: "Internal Server Error", 
      message: err, 
      }).code(500); 
     } else { 
      // ...do something with the data 
     } 
     }); 
    } else { 
     dbOne.query(query, (err, rows) => { 
     if (err) { 
      reply({ 
      statusCode: 500, 
      error: "Internal Server Error", 
      message: err, 
      }).code(500); 
     } else { 
      // ...do something with the data 
     } 
     }); 
    } 


    } 
}); 

server.start(err => { 
    if (err) throw err; 
}); 

Iはconst dbはそれ自身の範囲内で元の変数(dbOne又はdbTwo)にだけ参照し、各リクエストの終了時に消滅しているものとしていました。

変数dbは本当に自分自身と衝突し、MySQL接続に失敗しますか?あなたは、mysqlの接続のための変数の再割り当てを語るこのスレッド、見たいかもしれません

答えて

0

最終的にこれの底に到達しました。可変スコープは問題ではありませんでした。

MySQL接続が失敗して(おそらくデータベースサーバーのネットワークまたは負荷)、何らかの原因で接続がプールされていないため、接続が切断されたときに接続が中断されました。

私はmysql.createConnection({...からmysql.createPool({...に切り替えるので、1つの接続が失敗したときに別の接続が置き換えられ、それまでのところ良い状態になっていました。

0

- https://github.com/mysqljs/mysql/issues/900

また予防措置として、あなたのjsファイルに'use strict'ディレクティブを追加してみてください。これは、アプリケーション全体の変数の競合を避けるのに役立ちます。