pkpk
pkpk

Reputation: 832

mongodb Callback inside for loop in nodejs

I'm trying to fill up mongoDB collection with the data from Excel. I think I understand the asynch nature of callback and therefore have localized the scope using another function before the database callback. However, I'm unable to get past my error.

Here is the code.

var http = require('http');
var parseXlsx = require('excel');
var mongo = require('mongoskin');
var faker = require('faker');
var moment = require('moment');
var ObjectID = require('mongodb').ObjectID;

var uristring =
    process.env.MONGOLAB_URI ||
    process.env.MONGOHQ_URL ||
    'mongodb://localhost:27017/loadmongo/data';


var db = mongo.db(uristring, {native_parser:true});

db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function callback () {
  console.log('connected');


});

http.createServer(function handler(req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hello World\n');
}).listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');

parseXlsx('userRegistration.xlsx', function(err, data) {
    if(err) throw err;


    console.log(data.length);
    console.log(data[0][0]);    

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

        //(function(i){
        console.log('inside for loop');
        var t = Math.floor(Math.random()*10);
        var aCD = moment().subtract('days', t).format('MM DD YYYY');
        var tmpID = new ObjectID();
        console.log(data[i][0]);
        var tmp = {
                '_id': tmpID,
                'firstName': data[i][0],
                'lastName': data[i][1],
                'email1': data[i][2],
                'email2': data[i][3],
                'accountCreationDate': aCD,
                'location': {
                    'country' : data[i][9],
                    'city' : data[i][6],
                    'state' : data[i][7],
                    'stateCode' : data[i][7],
                    'zipcode' : data[i][10],
                    'streetName' : data[i][5],
                    'streetNumber' : data[i][4],
                    'countryCode' : data[i][8],
                    'longlat': {
                        'type' : "Point",
                        'coordinates': [data[i][12], data[i][11]]
                    }

                },
                'serviceNeededCurrent': {

                },
                'serviceOfferedCurrent': {

                },
                'serviceCompleted': {

                },
                'reviewsGiven': {

                },
                'reviewesRecieved': {

                },
                'financialRecords': {

                }
        };

        (function(tmp){
        db.collection('userRegistration').insert(tmp, function(err, result){
            if (err) {
                console.log(err);
                console.log('some error')

            }

            if (result)
                console.log('userRegistration Collection.. Done');


        }); 

        }(tmp));
    } //end of for loop


    }); // End of parsexlsx

and here is the output

Server running at http://127.0.0.1:1337/
675
Ernesto

C:\workspace\workspace1\loadmongo\node_modules\excel\node_modules\node-promise\promise.js:204
          throw error;
                ^
TypeError: Cannot read property '0' of undefined
    at C:\workspace\workspace1\loadmongo\hello-world-server.js:43:22
    at C:\workspace\workspace1\loadmongo\node_modules\excel\excelParser.js:156:3
    at Object._onImmediate (C:\workspace\workspace1\loadmongo\node_modules\excel\node_modules\node-promise\promise.js:164:27)
    at processImmediate [as _immediateCallback] (timers.js:336:15)

Upvotes: 0

Views: 510

Answers (1)

dgiugg
dgiugg

Reputation: 1334

Oh sorry I didn't realize that those were the outputs of your 2 console.log! Ok you just have to stop your loop before data.length!

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

Arrays indexes range from 0 to <arrayLength>-1 ;)

Upvotes: 2

Related Questions