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