2014-07-25 3 views
0

J'essaye de remplir la collection de mongoDB avec les données d'Excel. Je pense que je comprends la nature asynchrone du callback et ai donc localisé la portée en utilisant une autre fonction avant le rappel de la base de données. Cependant, je suis incapable de passer mon erreur.mongodb Rappel à l'intérieur pour la boucle dans nodejs

Voici le 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 

et voici la sortie

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) 
+0

Il semble être juste un problème avec votre méthode parseXlsx, non? Rien à voir avec Mongo, je suppose ... Votre ligne 43 est 'console.log (data [0] [0]), n'est-ce pas? Êtes-vous sûr de votre chemin de fichier? – dgiugg

+0

Vous pensez? mais, regardez la sortie 675 est la sortie pour console.log (data.length); et Ernesto est la sortie de console.log (data [0] [0]) ;. En outre, lorsque j'ai supprimé l'ensemble pour la boucle et l'appel de base de données, je ne vois pas l'erreur. – pkpk

+0

J'ai aussi remarqué, malgré avoir vu l'erreur, db est tout rempli correctement. Ne peut toujours pas comprendre la raison de l'erreur. – pkpk

Répondre

2

Oh désolé je ne savais pas que ce sont les sorties de votre 2 console.log! Ok, vous devez juste arrêter votre boucle avant data.length!

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

index Arrays vont 0-<arrayLength>-1;)

+0

Merci, ça a marché. Cependant, j'essaye de penser pourquoi mon code n'a pas imprimé le contenu de la boucle for jusqu'à l'erreur? – pkpk