2014-07-25 2 views
0

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

당신의 parseXlsx 방법으로 단지 문제가 될 것 같습니다하지 않습니다 그것은? Mongo와는 아무 관련이 없습니다. 여러분의 라인 43은'console.log (data [0] [0]);'입니까? 파일 경로가 확실합니까? – dgiugg

+0

당신 생각하세요? 하지만 출력을 보면 console.log (data.length)의 출력이 675입니다. Ernesto는 console.log (data [0] [0]);의 출력입니다. 또한 전체 루프 및 데이터베이스 호출을 제거 할 때 오류가 표시되지 않습니다. – pkpk

+0

나는 또한 오류를 보았음에도 불구하고 db가 모두 올바르게 채워져 있음을 확인했습니다. 여전히 오류의 원인을 파악할 수 없습니다. – pkpk

답변

2

오, 미안 해요 사람들은 당신이 console.log의 출력이 있다고 몰랐 출력을입니다! 좋습니다 data.length 전에 루프를 멈춰야합니다.

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

배열 인덱스는 0<arrayLength>-1에 이르기까지 다양합니다)

+0

고마워, 효과가 있었다. 그러나, 왜 내 코드가 오류까지 for 루프의 내용을 인쇄하지 않았는지 생각하려고합니다. – pkpk

관련 문제