2014-04-22 19 views
6

Mam poniższy skrypt węzła, aby zasadniczo skopiować zawartość niektórych plików i wstawić je do mongo.Skrypt węzła nigdy się nie kończy

Scenariusz nigdy się nie kończy i pomimo tego, że wszystkie dane zostały pomyślnie wstawione, zawsze muszę wykonać Ctrl + C, aby go zabić.

Czy jest coś, co powinienem użyć w pliku node.js, aby zakończyć skrypt?

var mongoose = require('mongoose'); 
mongoose.connect('mongodb://localhost/testdb'); 
var dir = './seeds'; 
var db = mongoose.connection; 

// Show connection error if there is one 
db.on('error', console.error.bind(console, 'Database Connection Error:')); 

// If we successfully connected to mongo 
db.once('open', function callback() { 

    var fs = require('fs'); // Used to get all the files in a directory 

    // Read all the files in the folder 
    fs.readdir(dir, function(err, list) { 

     // Log the error if something went wrong 
     if(err) { 
      console.log('Error: '+err); 
     } 

     // For every file in the list 
     list.forEach(function(file) { 

      // Set the filename without the extension to the variable collection_name 
      var collection_name = file.split(".")[0]; 
      var parsedJSON = require(dir + '/' + file); 

      for(var i = 0; i < parsedJSON.length; i++) { 

       // Counts the number of records in the collection 
       db.collection('cohort').count(function(err, count) { 
        if(err) { 
         console.log(err); 
        } 
       }); 

       db.collection(collection_name).insert(parsedJSON[i], function(err, records) { 

        if(err) { 
         console.log(err); 
        } 

        console.log(records[0]); 
        console.log("Record added as "+records[0]); 

       }); 
      } 

     }); 
    }); 
}); 
+4

Może być konieczne zamknięcie połączenia 'db'. Jeśli chodzi o 'node.js', to pozostaje ono możliwym źródłem zdarzeń, o ile jest otwarte. –

+0

Odpowiedź jest poprawna, a komentarze są poprawne. Zasadniczo musisz zrozumieć, że działasz w "pętli zdarzeń", a konsekwencją tego jest to, że po otwarciu programów obsługi zdarzeń "tak, jak masz" (nawet jeśli nie wiesz, że to zrobiłeś), pętla będzie czekać na zdarzenia. Zamknij moduły obsługi lub jawnie "zakończ pętlę" –

Odpowiedz

7

Po wykonaniu wszystkich czynności zadzwoń pod numer mongoose.disconnect(). Jak poprawnie wskazuje @AaronDufour, węzeł nie zostanie zakończony, gdy funkcje wywołania zwrotnego procedury obsługi zdarzenia są zarejestrowane, ponieważ nie wiedzą, że nie oczekuje się więcej zdarzeń, na przykład połączenie emitujące zdarzenie "zamknij" lub "błąd".

4

możesz zadzwonić pod numer process.exit();, aby wyjść z

+0

Upewnij się jednak, że wszystkie żądania synchroniczne zostały całkowicie obsłużone. – zehelvion

Powiązane problemy