Knex:Error Pool2 - Error: connect ECONNREFUSED

Knex:Error Pool2 - Error: connect ECONNREFUSED

我正在与 Node.js、Express.js、Bookshelf.js 和 Knex.js

合作

默认 knex 池定义出现以下错误。

Knex:Error Pool2 - Error: connect ECONNREFUSED

这是以下 knex 定义(默认 pool.min 值为 2)

var knex = require('knex')({
            client: 'mysql',
            connection: config.connection,
});

我收到错误

Knex:Error Pool2 - Error: connect ECONNREFUSED
Knex:Error Pool2 - Error: connect ECONNREFUSED

它在以下定义下工作正常。

var knex = require('knex')({
            client: 'mysql',
            connection: config.connection,
            pool: {
                    min: 0,
                    max: 10
            }
});

我注意到错误打印了 n 次,其中 n 在 pool.min 值中。

谁能告诉我为什么会这样。虽然,错误已解决,但由于我是新手,我无法理解为什么会这样。

当远程系统或服务未侦听指定端口或您之间的防火墙使其看起来如此时,connect() 系统调用返回 ECONNREFUSED。

基本上,knex 无法连接到数据库服务器。 pool.min is 0 没有出现错误的原因是因为 pool2 库对零活动连接感到满意,并且在 knex 需要连接之前不会尝试连接到数据库。


跟进,knex 人don't seem to care to implement this。此外,问题似乎是在启动时遇到 ECONNREFUSED 时 Pool2 对象被破坏,knex 无法从中恢复。

也就是说,这个问题只在我启动时出现。如果数据库在池建立后/之后/发生故障,knex 将继续尝试连接,直到它恢复正常。 knex 或 mysql 客户端库中的某些内容可以很好地处理重新连接的情况,即使返回了 ECONNREFUSED。考虑到这一点,我采取的做法是:

setTimeout(function () {
    knex.raw('SELECT 1').catch(function (error) {
        log.fatal('caught exception trying to issue database keep-alive');

        // do something fatal, like exit or cluster.worker.disconnect()
    });
}, 0);

我在创建 knex 对象后立即执行此操作。快速失败。这对我有用,但是 YMMV。

正如 diz 所说,这是您在 knex 无法连接到数据库时看到的错误。当我收到该错误时,是因为我的本地主机上没有 MySQL 服务器 运行(我的连接对象中的 'host')上面有一个名称为在连接对象的 'database' 键中指示。我启动了 MySQL 并创建了空数据库,从那里一切都很好。以下是我为其他开发人员编写的步骤:

MySQL 运行前需要的步骤:

  1. mysql.server开始

  2. mysql -u root

  3. 创建用户 'our_user'@'localhost' 由 'our_password';

  4. 识别
  5. 创建数据库 dbname;

  6. GRANT ALL ON dbname.* TO 'our_user'@'localhost';