2014-04-01 37 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); 
     }); 

    }); 

} 
});