mysql Node.js应用程序中出现SequelizeConnectionError

z31licg0  于 2022-11-28  发布在  Mysql
关注(0)|答案(3)|浏览(671)

我有一个奇怪的问题,不知道问题出在什么地方。如果你能帮助我,我将感激不尽。
我有Node.js应用程序,它在本地windows 10计算机上运行良好。我在CentOS服务器中的Docker中成功运行了此应用程序。此应用程序与远程MySQL和PostgreSQL数据库一起工作。它正常工作了几天,但昨天我注意到我有错误。应用程序无法再连接到远程MySQL数据库。同时,如果我在本地计算机上运行应用程序或通过DBeaver/dbForge工具连接,我可以连接到远程MySQL数据库,没有任何问题。

MySQL.js

const Sequelize = require('sequelize');

const sequelize = new Sequelize('database_name', 'username', 'password', {
    host: 'host',
    dialect: 'mysql'
});

sequelize.authenticate().then(() => {
    console.log('Connection to database has been established successfully.');
}).catch(err => {
    console.error('Unable to connect to database:', err);
});

module.exports = sequelize;

路由.js

const express = require('express');

const router = express.Router();

const sequelize = require('../configurations/MySQL');
const Sequelize = require('sequelize');

const passport = require('passport');
require('../configurations/password')(passport);

router.post('/search_by_name', passport.authenticate('jwt', {session: false}, null), function(req, res) {
    const token = getToken(req.headers);
    if (token) {
        sequelize.query("LONG SQL QUERY", {
            replacements: {
                name: req.body.name,
            },
            type: Sequelize.QueryTypes.SELECT
        }).then((locations) => {
            res.status(200).send(locations)
        }).catch((error) => {
            res.status(400).send(error);
        });
    } else {
        return res.status(401).send({
            status: false,
            description: "Unauthorized"
        });
    }
});

正如你所看到的,我使用sequelize库将应用程序连接到远程MySQL数据库。我使用相同的库连接到远程PostgreSQL数据库。正如我之前所说的,只有当我尝试在Docker中连接到远程MySQL数据库时才会发生错误。Docker中的PostgreSQL连接没有错误。是否可能是Docker/网络内部的问题?

相关性

"sequelize": "^4.42.0"
"mysql2": "^1.6.4"

我也认为问题的原因可能是因为太多的池/连接和sequelize库不自动关闭它们。这就是为什么我重新启动docker的几次希望证实理论。不幸的是错误没有消失。
你怎么想,会发生什么事?

错误

Unable to connect to the database: { SequelizeConnectionError: connect ETIMEDOUT
    at Utils.Promise.tap.then.catch.err (/node_modules/sequelize/lib/dialects/mysql/connection-manager.js:149:19)
    at tryCatcher (/node_modules/bluebird/js/release/util.js:16:23)
    at Promise._settlePromiseFromHandler (/node_modules/bluebird/js/release/promise.js:512:31)
    at Promise._settlePromise (/node_modules/bluebird/js/release/promise.js:569:18)
    at Promise._settlePromise0 (/node_modules/bluebird/js/release/promise.js:614:10)
    at Promise._settlePromises (/node_modules/bluebird/js/release/promise.js:690:18)
    at _drainQueueStep (/node_modules/bluebird/js/release/async.js:138:12)
    at _drainQueue (/node_modules/bluebird/js/release/async.js:131:9)
    at Async._drainQueues (/node_modules/bluebird/js/release/async.js:147:5)
    at Immediate.Async.drainQueues [as _onImmediate] (/node_modules/bluebird/js/release/async.js:17:14)
    at processImmediate (timers.js:632:19)
  name: 'SequelizeConnectionError',
  parent:
   { Error: connect ETIMEDOUT
       at Connection._handleTimeoutError (/node_modules/mysql2/lib/connection.js:173:17)
       at listOnTimeout (timers.js:324:15)
       at processTimers (timers.js:268:5)
     errorno: 'ETIMEDOUT',
     code: 'ETIMEDOUT',
     syscall: 'connect',
     fatal: true },
  original:
   { Error: connect ETIMEDOUT
       at Connection._handleTimeoutError (/node_modules/mysql2/lib/connection.js:173:17)
       at listOnTimeout (timers.js:324:15)
       at processTimers (timers.js:268:5)
     errorno: 'ETIMEDOUT',
     code: 'ETIMEDOUT',
     syscall: 'connect',
     fatal: true }}
ftf50wuq

ftf50wuq1#

尝试在新建Sequelize时添加池选项。参考文档
Sequelize会在初始化时设置一个连接池,所以如果你从一个进程连接到数据库,你最好只为每个数据库创建一个示例。如果你从多个进程连接到数据库,你必须为每个进程创建一个示例,但是每个示例的最大连接池大小应该是“最大连接池大小除以示例数”。所以,如果您希望最大连接池大小为90,并且有3个工作进程,则每个进程的示例的最大连接池大小应为30。

const Sequelize = require('sequelize');

const sequelize = new Sequelize('database_name', 'username', 'password', {
    host: 'host',
    dialect: 'mysql',
    pool: {
      max: 15,
      min: 5,
      idle: 20000,
      evict: 15000,
      acquire: 30000
    },
});

module.exports = sequelize;

此外,您可以在这里查看更多选项

选项.池顺序连接池配置
选项.池.最大值默认值:5池中的最大连接数
选项.池.最小值默认值:0池中的最小连接数
选项.池.空闲默认值:10000连接在释放之前可以空闲的最长时间(毫秒)。与evict一起使用可以正常工作,有关详细信息,请参阅https://github.com/coopernurse/node-pool/issues/178#issuecomment-327110870
选项.池.获取默认值:10000池在抛出错误之前尝试获取连接的最长时间(毫秒)
选项.池.退出默认值:10000逐出过时连接的时间间隔(毫秒)。将其设置为0可禁用此功能。
选项.池.句柄断开连接默认值:false控制池是否应在不引发错误的情况下自动处理连接断开
options.pool.validate验证连接的函数。通过客户端调用。默认函数检查客户端是否为对象,以及其状态是否未断开连接

wbrvyc0a

wbrvyc0a2#

在简单的条款,我想说的是,这些类型的错误来时,你的一些配置错误输入.这些是:
1.数据库名称
1.用户名
1.密码
因此请在congif.json文件中交叉验证这些内容

zpgglvta

zpgglvta3#

我建议检查数据库主机名。如果指定的是IP地址而不是域,请尝试解析主机名。这样可以解决问题。

相关问题