2013-05-17 22 views
7

Wygląda na to, że nie mogę zamknąć połączenia MongoDB z natywnym sterownikiem Node.js. Po uruchomieniu node replica.js skrypt nigdy się nie kończy, dlatego połączenie nie może zostać zamknięte z jakiegoś powodu.Nie można zamknąć połączenia MongoDB z Node.js?

Oto kod. Jest to replika ustawiona, ale nie sądzę, że jest to problem:

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

Podłączenie do jednej instancji mongod działa dobrze, gra się zamknięte i skrypt kończy, bez potrzeby (sugerowane przez robertklep) z process.exit() zadzwoń:

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

Odpowiedz

5

Okazuje się, że to był błąd, teraz stała w 1.3.6. Spójrz na this issue I opened kilka dni temu. Zabawne jest to, że to mój pierwszy raz z MongoDB ...

0

może trzeba wymusić puli połączeń, aby zamknąć w tym przypadku poprzez przepuszczenie true jako pierwszy parametr do close. Należy również zapewnić zwrotnego, dzięki czemu można być powiadamiani o wszelkich problemach, próbując zamknąć:

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

Dlaczego mój drugi przykład działa bez forsowania, ale muszę wymusić zamknięcie połączenia z zestawem replik? – gremo

+0

@Gremo Nie powinieneś tego robić, ale dzieje się coś nieoczekiwanego. Czy wywołanie zwrotne jest wywoływane bez błędu? – JohnnyHK

+0

Brak błędów. Nawet użycie 'close (true)' nie pomaga. Twój kod wypisuje "close complete" i nigdy nie wychodzi ze skryptu. Muszę zbliżyć się do "CTRL + C". – gremo

Powiązane problemy