2014-04-01 71 views
1

所以我有一個CSV文件,其中包含我的信息,我需要做一個質量add/update的NodeJS貓鼬從文件質量/批量更新

exports.add_questions_from_file = function (file_path, surveyid, callback) 
{ 
    var U = [{}]; 
    fs.readFile(file_path, 'utf8', function(err, data){ 
    if (err){ 
     console.log(err); 
     callback(err,null); 
    }else{ 
     console.log(data); 
     d = data.split(/\r\n|\n/); 
     for (x=0;x <d.length;x++) 
     { 
      line = d[x].split(','); 
      if (line[0] == "") {return}; 
      RQuestion.add_by_line (line,function (err, question) 
      { 
        U.push({id:question.id}); 
        console.log(U); 
      }); 
     } 
    } 

    }); 
    Survey.update({_id:surveyid},{$push:{"SurveyQuestions":U}},function (err,numAffected, rawResponse) { 
       console.log(rawResponse); 
       RET = {"module":"survey","operation": "add", "status":"OK"}; 
       callback(RET); 
    }); 
}; 

但是,即使使用回調函數的更新似乎IM使用相同的發生對象始終,甚至console.log這裏

U.push({id:question.id}); 
console.log(U); 

返回相同的對象(即使所有其他被創造)

Im做someth錯了嗎?

回答

0

我看到一些問題。

首先爲:

if (line[0] == "") {return}; 

不要你的意思是使用一個休息還是繼續呢?否則,如果文件中的任何位置有空行,整個函數將會退出。這非常重要,因爲Survey.update也不會被調用。

第二:我認爲RQuestion.add_by_line和Survey.update正在做一些像更新數據庫一樣的異步操作。在繼續下一步之前,您的代碼需要重構以等待這些異步項目完成。我推薦一個名爲async的npm包。

fs.readFile(file_path, 'utf8', function(err, data){ 
if (err){ 
    console.log(err); 
    callback(err,null); 
}else{ 
    d = data.split(/\r\n|\n/); 

    async.map(d, function(line, callback) { 
     //this function is called for each line 
     add_by_line (line,function (err, question) 
     { 
     callback(err,{id:question.id}); 
     }); 
    }, function(err, results) { 
     //this function is called when all of the items are done 
     console.log("done with async"); 
     console.dir(results); 
     Survey.update({_id:surveyid},{$push:{"SurveyQuestions":results},function (err,numAffected, rawResponse) { 
       console.log(rawResponse); 
       RET = {"module":"survey","operation": "add", "status":"OK"}; 
       callback(RET); 
     }); 

    }); 

} 
});