2014-10-13 13 views
26

wczoraj zacząłem używać sterownika javascript MongoDB.MongoDB "Gniazda serwera zamknięte" i brak poprawki znaleziono

Wystąpił problem, błąd stale się wyświetla, ale dane są nadal przechowywane.

Poniżej przedstawiono javascript, którego używam do początkowego łączenia się z bazą danych, a następnie inicjowane jest zapytanie wstawiania. Kiedy nie inicjując INSERT, wyjścia konsoli:

prawidłowo podłączony do serwera

odłączony od serwera powodzeniem

Ale gdy uruchomiony z kwerendy INSERT, zwracany jest błąd.

prawidłowo podłączony do serwera

{ [MongoError: server localhost:27017 sockets closed] nazwa: 'MongoError',

message: 'server localhost:27017 sockets closed'}

odłączony od serwera powodzeniem

Może ktoś mi punkt w dobrym kierunku?

MongoClient.connect(db_default.db_url, function(err, db) { 
    console.log('Connected correctly to server'); 
    if(err) { 
     console.log(err); 
    } 
    else { 
     mongoInsert(db, 'user', user_default, function(user_res) { 
      console.log(user_res); 
     }); 
    } 
    db.close(); 
    console.log('Disconnected from server successfully'); 
}); 

function mongoInsert(db, collection_name, data,cb) { 
    var collection = db.collection(collection_name); 
    collection.insert(data, function(err, res) { 
     if(err) { 
      console.log(err); 
     } 
     else { 
      console.log('Inserted into the ' + collection_name + ' collection'); 
      cb(res); 
     } 
    }); 
} 
+12

Asynchroniczność. Twoje wywołanie zwrotne połączenia wywołuje funkcję wstawiania i natychmiast zamyka połączenie z bazą danych przed faktycznym uruchomieniem wkładki. Spróbuj zamknąć połączenie bazy danych w wywołaniu zwrotnym z insertu. – wdberkeley

+0

@wdberkeley Więc jeśli połączenie się zamyka przed uruchomieniem wkładki, w jaki sposób przechowywane są dane? –

+0

@SasankaPanguluri jest to niedeterministyczne, ale jeśli wystąpi wstawka, to dzieje się tak, że sterownik bazy danych wysyła żądanie do bazy danych, a następnie zamyka połączenie. Baza danych przetwarza wstawkę, ale nie może pomyślnie ukończyć interakcji z powodu zamknięcia gniazda. – Eoin

Odpowiedz

49

Nie zamykaj połączenia db przed otrzymaniem wyników. Wykonaj następujące:

MongoClient.connect(db_default.db_url, function(err, db) { 
    if(err) { 
     console.log(err); 
    } 
    else { 
     mongoInsert(db, 'user', user_default, function(user_res) { 
      console.log(user_res); 
      db.close(); 
     }); 
    } 

    console.log('Disconnected from server successfully'); 
}); 

function mongoInsert(db, collection_name, data,cb) { 
    var collection = db.collection(collection_name); 
    collection.insert(data, function(err, res) { 
     if(err) { 
      console.log(err); 
     } 
     else { 
      console.log('Inserted into the ' + collection_name + ' collection'); 
      cb(res); 
     } 
    }); 
} 
+8

Zapytany prawie rok temu i nie dałem ci wielkiego zielonego kleszcza. Dziękuję za pomoc, z przyszłości! –

0

znalazłem rozwiązanie w końcu problemem było bezpieczeństwo plik na nowych plików serwera i mongdb NPM, musiałem użyć „chown” Polecenie właścicielem wszystkich plików, a następnie uruchomić „NPM zainstaluj "