我遇到了 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连接失败!?
最佳答案
您可能想看看这个线程,它讨论了 mysql 连接的变量重新分配 - https://github.com/mysqljs/mysql/issues/900
另外,作为预防措施,请尝试将 'use strict'
指令添加到您的 js 文件中。它将有助于避免整个应用程序中的变量冲突
关于javascript - Hapi JS 路由处理程序中的 JS 变量范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45857748/