2017-08-24 1 views
0

Ich stieß auf einen mysql-Verbindungsfehler, den ich anscheinend durch das Erraten eines JS-Variablenbereichsfehlers behoben habe.JS variabler Bereich in Hapi JS Route-Handler

Im Route-Handler habe ich den Code auskommentiert, der den folgenden MySQL-Fehler ausgelöst hat: PROTOCOL_ENQUEUE_AFTER_FATAL_ERROR, und den folgenden Arbeitscode enthalten.

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; 
}); 

Ich hatte angenommen, dass const db war nur ein Verweis auf die ursprüngliche Variable (dbOne oder dbTwo) innerhalb seiner eigenen Anwendungsbereich und hörte am Ende jeder Anfrage zu existieren.

Ist die db Variable wirklich in Konflikt mit sich selbst und verursacht die MySQL-Verbindung fehlschlagen?

Antwort

0

Schließlich auf den Grund dieser. Der variable Umfang war nicht das Problem.

Irgendetwas hat dazu geführt, dass die MySQL-Verbindung fehlschlug (vielleicht das Netzwerk oder die Last des Datenbankservers), und da ich die Verbindungen nicht bündelte, blieb eine Verbindung brach, wenn sie unterbrochen wurde.

Ich wechselte mysql.createConnection({... zu mysql.createPool({... so wenn eine Verbindung fehlgeschlagen andere ersetzt es, und so weit so gut.

0

Sie könnten Blick auf diesen Thread möchte, die für MySQL-Verbindungen über variable Neuzuordnung spricht - https://github.com/mysqljs/mysql/issues/900

auch als Vorsichtsmaßnahme, versuchen Sie, die 'use strict' Richtlinie Ihre js Dateien. Es wird helfen, den Konflikt der Variablen in Ihrer gesamten Anwendung zu vermeiden