Catfish Catfish - 4 months ago 8
Node.js Question

Node script doesn't ever end

I have the node script below to basically copy the contents of some files and insert them to mongo.

The script never seems to end and even though all the data gets inserted successfully, I always have to do Ctrl+C to kill it.

Is there something i'm supposed to use in node.js to end a script?

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

});
}

});
});
});

Answer

When everything is done, call mongoose.disconnect(). As @AaronDufour correctly points out, node will not exit while event handler callbacks are registered because it doesn't know that no more events are expected, like the connection emitting a 'close' or 'error' event, for example.

Comments