Knex:错误池2 - 错误:连接ECONNREFUSED

时间:2015-11-20 09:42:29

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

我正在使用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为pool.min值。

有人可以告诉我为什么会这样。虽然错误已经解决,但由于我是新手,我无法理解为什么会这样。

2 个答案:

答案 0 :(得分:4)

当远程系统或服务未在指定端口上侦听或者您之间的防火墙使其显示时,connect()系统调用会返回ECONNREFUSED。

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

要跟进,knex人don't似乎care要实施this。此外,问题似乎是在启动时遇到ECONNREFUSED并且knex无法从中恢复时,Pool2对象被销毁。

话虽如此,这个问题只发生在我的启动时。如果数据库关闭/之后/池建立,knex将继续尝试连接,直到它恢复。即使返回了ECONNREFUSED,knex或mysql客户端库中的某些东西也可以处理重新连接的情况。考虑到这一点,我所要做的就是:

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对象后,我执行了 immediatey 。失败快。这对我有用,但YMMV。

答案 1 :(得分:1)

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

此前运行所需的MySQL步骤:

  1. mysql.server start

  2. mysql -u root

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

  4. 识别
  5. CREATE DATABASE dbname;

  6. 全部授予dbname。* TO' our_user' @' localhost';