Иногда эта ошибка возникает случайно в моем проекте nodejs,mysql, который размещен в службе приложений Azure. Из-за этого моя служба приложений отключается много раз в день, тогда как мой промежуточный сервер приложений все еще работает и подключен к той же базе данных, я использую пакет mysql2 для подключения к базе данных mysql. Я использую пул соединений для подключения к базе данных MySQL. Иногда я получаю эту ошибку случайно. Я не могу выяснить причину этой ошибки. Может ли кто-нибудь мне помочь с этим?
/home/site/wwwroot/node_modules/mysql2/lib/connection.js:205
const err = new Error('connect ETIMEDOUT');
^
Error: connect ETIMEDOUT
at PoolConnection._handleTimeoutError (/home/site/wwwroot/node_modules/mysql2/lib/connection.js:205:17)
at listOnTimeout (node:internal/timers:573:17)
at process.processTimers (node:internal/timers:514:7) {
errorno: 'ETIMEDOUT',
code: 'ETIMEDOUT',
syscall: 'connect',
fatal: true
}
Ниже приведен код подключения к базе данных для mysql2.
const mysql = require("mysql2");
require("dotenv").config();
const CONNECTION_LIMIT = process.env.CONNECTION_LIMIT;
const IDLE_TIMEOUT = process.env.IDLE_TIMEOUT;
const MAX_IDLE = process.env.MAX_IDLE;
function createCentralPool(credentials, options) {
try {
let { removeDatabase } = options || {};
let dbinfo = {
host: process.env.DEFAULT_DB_HOST,
user: process.env.DEFAULT_DB_USER,
password: process.env.DEFAULT_DB_PASSWORD,
database: process.env.DEFAULT_DB_DATABASE,
port: process.env.DEFAULT_DB_PORT,
connectionLimit: CONNECTION_LIMIT,
idleTimeout: IDLE_TIMEOUT,
maxIdle: MAX_IDLE,
charset: "utf8mb4",
dateStrings: true,
...credentials,
};
if (removeDatabase) delete dbinfo.database;
const pool = mysql.createPool({
...dbinfo,
enableKeepAlive: true,
});
const promisePool = pool.promise();
return promisePool;
} catch (error) {
console.log(error, "createCentralPool");
}
}
function createPoolForUserDatabase(credentials) {
try {
let dbInfo = {
host: process.env.DEFAULT_DB_HOST,
user: process.env.DEFAULT_DB_USER,
password: process.env.DEFAULT_DB_PASSWORD,
// database: process.env.DEFAULT_DB_DATABASE,
port: process.env.DEFAULT_DB_PORT,
connectionLimit: CONNECTION_LIMIT,
idleTimeout: IDLE_TIMEOUT,
maxIdle: MAX_IDLE,
charset: "utf8mb4",
dateStrings: true,
...credentials,
};
const pool = mysql.createPool({ ...dbInfo });
// Log connection events
// logPoolEvents(pool);
const promisePool = pool.promise();
return promisePool;
} catch (error) {
console.log(error, "createPoolForUserDatabase");
}
}
const centralDbPool = createCentralPool();
const userDbPools = new Map();
function getUserDbPool(_credentials) {
let credentials = { ..._credentials };
delete credentials?.details;
try {
const { database } = credentials || {};
let userDbPool = userDbPools.get(database);
if (!userDbPool) {
userDbPool = createPoolForUserDatabase(credentials);
userDbPools.set(database, userDbPool);
}
return userDbPool;
} catch (error) {
console.log(error);
throw new Error(error);
}
}
module.exports = {
centralDbPool,
createCentralPool,
getUserDbPool,
};
Подробнее здесь: https://stackoverflow.com/questions/793 ... -causing-t