【问题标题】:Knex:Error Pool2 - Error: connect ECONNREFUSEDKnex:错误池 2 - 错误:连接 ECONNREFUSED
【发布时间】:2015-11-20 09:42:29
【问题描述】:

我正在使用 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 值中。

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

【问题讨论】:

    标签: node.js express bookshelf.js knex.js


    【解决方案1】:

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

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


    跟进,knex 人don't 似乎care 实施this。此外,问题似乎是 Pool2 对象在启动时遇到 ECONNREFUSED 时被破坏,并且 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。

    【讨论】:

    • 我明白了。虽然 pool.min 0 满足我的要求,但有没有办法可以使用 pool.min > 0 ?
    • 我添加了我正在使用的解决方法并取得了一些成功。它并不完美——事实上,我觉得它相当恶心——但它确实有效。
    【解决方案2】:

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

    运行前需要执行 MySQL 步骤:

    1. mysql.server 启动

    2. mysql -u root

    3. CREATE USER 'our_user'@'localhost' IDENTIFIED BY 'our_password';

    4. 创建数据库数据库名称;

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

    【讨论】:

    • 是的,我理解这个问题。你是对的。但是我仍然无法在 pool.min 超过 0 的情况下运行它。虽然我现在不需要它保持 > 0,但仍然想知道是否有出路。
    猜你喜欢
    • 2019-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-29
    • 2019-03-15
    • 2015-07-27
    • 2014-05-20
    • 2021-03-14
    相关资源
    最近更新 更多