2015-11-20 11 views
5

sto lavorando con Node.js, Express.js, Bookshelf.js e Knex.jsKnex: Errore Pool2 - Errore: collegare ECONNREFUSED

sto ottenendo seguente errore con la definizione pool predefinito knex.

Knex:Error Pool2 - Error: connect ECONNREFUSED 

cioè con seguente definizione knex (il valore predefinito è pool.min 2)

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

ottengo errore

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

Dove, come funziona bene con seguente definizione.

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

Ho notato che l'errore viene stampato n numero di volte dove n nel valore pool.min.

Qualcuno può dirmi perché questo sta accadendo. Sebbene, l'errore è risolto ma poiché sono novizio, non sono in grado di capire perché questo sta accadendo.

risposta

4

ECONNREFUSED viene restituito dalla chiamata di sistema connect() quando il sistema o il servizio remoto non è in ascolto sulla porta specificata o un firewall tra di voi sta facendo apparire tale.

Fondamentalmente, knex non è in grado di connettersi al server del database. Il motivo per cui non si ottiene l'errore con pool.min è 0 è perché la libreria pool2 è soddisfatta con zero connessioni attive e non tenterà di connettersi al database finché non sarà necessaria una connessione da parte di knex.


di follow-up, la gente knex don't sembrano care per implementare this. Inoltre, il problema sembra essere che l'oggetto Pool2 viene distrutto quando ECONNREFUSED viene rilevato all'avvio e knex non è in grado di recuperare da esso.

Ciò detto, il problema si verifica solo all'avvio. Se il database si interrompe/dopo che il pool è stato stabilito, knex continuerà a provare a connettersi finché non verrà ripristinato. Qualcosa in entrambe le librerie client knex o mysql gestisce correttamente il caso di riconnessione, anche se viene restituito ECONNREFUSED. Con questo in mente, quello che ho preso a fare è questo:

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); 

faccio questo immediatey dopo aver creato l'oggetto knex. Fallire veloce Questo funziona per me, ma YMMV.

+1

Ho capito. Sebbene pool.min 0 soddisfi il mio requisito, ma esiste un modo in cui può funzionare con pool.min> 0? – Rusty

+0

Ho aggiunto la soluzione che sto usando con un certo successo. Non è perfetto, anzi, lo trovo piuttosto disgustoso, ma funziona. – diz

1

Come dice Diz, questo è l'errore che si vede quando knex non può connettersi al database. Quando ricevevo quell'errore, era perché non avevo un server MySQL in esecuzione sul mio localhost (il mio 'host' nell'oggetto connessione) che aveva un database su di esso con il nome indicato nella chiave 'database' della connessione oggetto. Ho attivato MySQL e creato il database vuoto e tutto è andato benissimo da lì. Ecco i passi che ho scritto per i miei compagni sviluppatori:

passi MySQL necessari prima di questo viene eseguito:

  1. mysql.start server

  2. radice mysql -u

  3. Crea utente 'our_user' @ 'localhost' IDENTIFICATO DA 'our_password';

  4. CREATE DATABASE dbname;

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

+0

Sì, ho capito il problema. Hai ragione. Ma non riesco ancora a eseguirlo per pool.min più di 0. Sebbene non lo richieda per mantenere> 0 per ora, ma vorrei comunque sapere se c'è una via d'uscita. – Rusty

+0

Fonte: http://blogs.candoerz.com/question/182128/knexerror-pool2-error-connect-econnrefused.aspx –

Problemi correlati