2013-05-17 23 views
7

Sembra che non riesca a chiudere una connessione MongoDB con il driver nativo Node.js. Quando eseguo node replica.js lo script non termina mai, quindi la connessione non può essere chiusa per qualche motivo.Impossibile chiudere una connessione MongoDB con Node.js?

Ecco il codice. Si tratta di un set di repliche, ma non credo che sia un problema:

var mongodb = require('mongodb') 
    , Db  = mongodb.Db 
    , Server = mongodb.Server 
    , ReplSet = mongodb.ReplSet; 

// Replica set 
var replSet = new ReplSet([ 
    new Server('localhost', 27017), // Primary 
    new Server('localhost', 27018), // Secondary 
    new Server('localhost', 27016), // Secondary 
    ], 
    { rs_name: 'replica', read_secondary: true } 
); 

var db = new Db('test', replSet, { native_parser: true, w: 1 }); 

// Opening 
db.open(function (err, db) { 
    if (err) console.error(err); 

    db.close(); 
}); 

Collegamento a una singola istanza mongod funziona bene, il collegamento ottenere chiuso e lo script finisce, senza la necessità (suggerito da robertklep) di process.exit() chiamare:

var mongodb = require('mongodb') 
    , Db  = mongodb.Db 
    , Server = mongodb.Server; 

// Single instance 
var server = new Server('localhost', 27017): 
var db = new Db('test', server, { native_parser: true, w: 1 }); 

// Opening 
db.open(function (err, db) { 
    if (err) console.error(err); 

    db.close(); 
}); 

risposta

5

Si scopre che si trattava di un bug, ora risolto in 1.3.6. Guarda this issue I opened pochi giorni fa. La cosa divertente è che è la mia prima volta con MongoDB ...

0

potrebbe essere necessario forzare il pool di connessioni per chiudere in questo caso passando true come primo parametro a close. Si dovrebbe anche fornire una richiamata in modo da poter essere avvisati di eventuali problemi quando si cerca di chiudere:

db.open(function (err, db) { 
    if (err) console.error(err); 

    db.close(true, function (err) { 
     if (err) console.error(err); 
     else console.log("close complete"); 
    }); 
}); 
+0

Perché il mio secondo esempio funziona senza forzare, ma devo forzare la chiusura della connessione con il set di repliche? – gremo

+0

@Gremo Non è necessario, ma qualcosa di inaspettato sta succedendo. Il callback viene chiamato senza errori? – JohnnyHK

+0

Nessun errore. Anche l'uso di 'close (true)' non aiuta. Il tuo codice stampa "close complete" e non esce mai dallo script. Devo forzare la chiusura con 'CTRL + C'. – gremo

Problemi correlati