2015-11-20 7 views
5

Я работаю с Node.js, Express.js, Bookshelf.js и Knex.jsKnex: Ошибка Pool2 - Ошибка: подключение ECONNREFUSED

я получаю следующее сообщение об ошибке с определением 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.

Может кто-нибудь скажет мне, почему это происходит. Хотя ошибка решена, но поскольку я новичок, я не могу понять, почему это происходит.

ответ

4

ECONNREFUSED возвращается системным вызовом connect(), когда удаленная система или служба либо не прослушивает указанный порт, либо межсетевой экран между ними делает это так.

В принципе, knex не может подключиться к серверу базы данных. Причина, по которой вы не получаете ошибку с pool.min, равна 0, потому что библиотека pool2 удовлетворена нулевыми активными соединениями и не будет пытаться подключиться к базе данных, пока соединение не понадобится на knex.


Чтобы следить, как knex люди don't, кажется, care реализовать this. Кроме того, проблема заключается в том, что объект Pool2 уничтожается, когда ECONNREFUSED встречается при запуске, а 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); 

Я делаю это immediatey после создания объекта knex. Сбой быстро. Это работает для меня, но YMMV.

+1

Я понял. Хотя pool.min 0 удовлетворяет моему требованию, но есть ли способ, которым он может работать с pool.min> 0? – Rusty

+0

Я добавил обходной путь, который я использую с некоторым успехом. Это не идеально - на самом деле, я считаю это довольно отвратительным, но это работает. – diz

1

Как говорит диз, это ошибка, которую вы видите, когда knex не может подключиться к базе данных. Когда я получал эту ошибку, это произошло потому, что у меня не было сервера MySQL, работающего на моем localhost (мой «хост» в объекте подключения), на котором была база данных с именем, указанным в ключе базы данных соединения объект. Я запускал MySQL и создал пустую базу данных, и оттуда все было отлично. Вот шаги, которые я написал для моих коллег дэвов:

шаги MySQL, необходимые до этого работает:

  1. MySQL.Сервер запуска

  2. MySQL -u корень

  3. CREATE USER 'our_user' @ 'локальный' ОПРЕДЕЛЕННЫЕ 'our_password';

  4. CREATE DATABASE dbname;

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

+0

Да, я понял проблему. Ты прав. Но я все еще не могу запустить его для pool.min более 0. Хотя, я не требую, чтобы он продолжал> 0, но все же хотел бы знать, есть ли выход. – Rusty

+0

Источник: http://blogs.candoerz.com/question/182128/knexerror-pool2-error-connect-econnrefused.aspx –