【问题标题】:JS variable scope within Hapi JS route handlerHapi JS 路由处理程序中的 JS 变量范围
【发布时间】:2017-09-16 16:15:19
【问题描述】:

我遇到了一个 mysql 连接错误,我猜测这是一个 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 连接失败!?

【问题讨论】:

    标签: javascript mysql node.js hapijs


    【解决方案1】:

    你可能想看看这个线程,它讨论了 mysql 连接的变量重新分配 - https://github.com/mysqljs/mysql/issues/900

    作为预防措施,请尝试将 'use strict' 指令添加到您的 js 文件中。这将有助于避免整个应用程序中的变量冲突

    【讨论】:

      【解决方案2】:

      终于明白了。变量范围不是问题。

      某些原因导致 MySQL 连接失败(可能是数据库服务器的网络或负载),并且由于我没有对连接进行池化,因此一旦连接断开,它就会一直断开。

      我将mysql.createConnection({... 切换到mysql.createPool({...,所以当一个连接失败时,另一个连接替换它,到目前为止一切都很好。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-09-12
        • 1970-01-01
        • 2012-11-24
        • 1970-01-01
        • 2014-07-04
        • 2011-10-23
        • 1970-01-01
        相关资源
        最近更新 更多