Excel에서 데이터로 mongoDB 컬렉션을 채우려고합니다. 콜백의 비동기 특성을 이해하고 따라서 데이터베이스 콜백 전에 다른 함수를 사용하여 범위를 현지화했다고 생각합니다. 그러나 나는 내 실수를 극복 할 수 없다.mongodb callback 내부 for 루프 nodejs
다음은 코드입니다.
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
여기가
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)
당신의 parseXlsx 방법으로 단지 문제가 될 것 같습니다하지 않습니다 그것은? Mongo와는 아무 관련이 없습니다. 여러분의 라인 43은'console.log (data [0] [0]);'입니까? 파일 경로가 확실합니까? – dgiugg
당신 생각하세요? 하지만 출력을 보면 console.log (data.length)의 출력이 675입니다. Ernesto는 console.log (data [0] [0]);의 출력입니다. 또한 전체 루프 및 데이터베이스 호출을 제거 할 때 오류가 표시되지 않습니다. – pkpk
나는 또한 오류를 보았음에도 불구하고 db가 모두 올바르게 채워져 있음을 확인했습니다. 여전히 오류의 원인을 파악할 수 없습니다. – pkpk