2017-08-24 46 views
0

中變量的作用域我遇到了,我似乎被猜測它是一個JS變量範圍的問題有固定的一個MySQL連接錯誤。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; 
}); 

我曾假定const db只是給它自己的範圍內的原始變量(dbOne或dbTwo)的引用,並停止在每個請求的末尾存在。

是在db變量真正與自己發生衝突並導致MySQL連接失敗!?

回答

0

終於得到了這條底線的變量衝突。變量的範圍不是問題。

東西是造成MySQL連接失敗(也許是數據庫服務器的網絡或負載),和我沒有池的連接,一旦連接打破它停留爆發。

我轉換mysql.createConnection({...mysql.createPool({...所以當一個連接失敗時另一個替換它,並且到目前爲止這麼好。

0

你可能想看看這個線程,其講述的變量重新分配的MySQL連接 - https://github.com/mysqljs/mysql/issues/900

而且作爲一項預防措施,嘗試添加'use strict'指令的js文件。這將有助於避免在您的整個應用程序