javascript - Nodejs mongoose 从文件批量/批量更新

标签 javascript node.js asynchronous

所以我有一个包含我的信息的 csv 文件,我需要进行批量添加/更新

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

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

我做错了什么吗?

最佳答案

我发现一些问题。

首先用于:

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

    });

 }
});

关于javascript - Nodejs mongoose 从文件批量/批量更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22779046/

相关文章:

android - Phonegap - 设置 Phonegap

node.js - MongoDB GridFS API 返回损坏的 .zip

javascript - 单击按钮并打开子菜单后,如何使按钮保持在原位

javascript - 在浏览器中使用模块(没有 WebPack)

Javascript 关系数据库

node.js - 无法使用 express 处理 node.js 域的异常

.net - 提供异步编程模型 : Should I?,如果是,应该是 VerbAsync() 还是 BeginVerb()?

linux - 如何在 shell 脚本中异步运行迭代

python-3.x - Python 的 asyncio.gather() 似乎没有异步运行任务

javascript - JS->对输入进行表单验证。使用for循环获取所有输入索引