Nodejs mongoose从文件中进行批量/批量更新

时间:2014-04-01 07:06:40

标签: javascript node.js asynchronous

所以我有一个包含我的信息的csv文件,我需要做一个质量add/update

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

但即使我使用回调函数,更新似乎总是发生在同一个对象上,即使是console.log这里

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

返回相同的对象(即使创建了所有其他对象)

我做错了什么?

1 个答案:

答案 0 :(得分: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);
        });

    });

 }
});