javascript - 上传多个文件时出现异步问题

标签 javascript node.js mongodb express gridfs

您好,我正在尝试上传多个文件,文件写入正确。但我想将文件移动到 mongo grid fs 中,第一个文件仅正确移动,文件的其余部分不会移动到 grid fs 中,也不会取消链接。

这是我的代码:

for (var i = 0; i < files.length; i++) {
    (function(i) {
        var singleFile = files[i];
        var fileData = JSON.parse(files[i].name);
        var fileName = fileData.fileName;
        var fileType = files[i].type;
        var uniqId = fileData.attachmentId;
        var targetPath = "./attachments/" + uniqId;
        var tmp_path = files[i].path;

    console.log("uniqId : " + uniqId);
    //uploadFile(tmp_path,targetPath,fileName,uniqId,fileType);

    fs.readFile(tmp_path, function(err, data) {
        fs.writeFile(targetPath, data, function(err) {
            if (!err) {
                mongoose.connect(configSettings.mongodb.ip, configSettings.mongodb.databasename, configSettings.mongodb.port, function(err, succ) {
                    var id = new ObjectID(uniqId);
                    new GridStore(mongoose.connection.db, id, fileName, 'w', {
                        'content_type': 'application/octet-stream'
                    }).open(function(err, gs) {
                        gs.writeFile(targetPath, function(err) {
                            if (err) {
                                console.log("err");
                            }
                            gs.close(function(err) {
                                console.log("success");
                                fs.unlink("./attachments/" + uniqId, function(err) {
                                    console.log("err : " + err);
                                    console.log(uniqId + ' ::successfully deleted ');
                                });
                                mongoose.connection.close();
                            });
                        });
                    });
                });
            }
        });
    });
   })(i);
}

    res.send("success");

我尝试过使用闭包函数,即使我也尝试过创建单独的函数,但结果相同(仅插入一个文件并取消链接)。

在这种情况下我必须做什么才能将所有文件存储在 gridfs 中并从临时文件夹取消链接?

最佳答案

这是我的猜测。由于您的调用被推迟到稍后,您的函数结束并且文件列表可能被 Node 或其他什么删除,您可以在此处看到一个简化的示例:

let myList = [1, 2, 3, 4, 5];

function doWork(list) {
  console.log('Start of function');
  
  for (let i = 0; i < list.length; i++) {
    (function(i) {
      setTimeout(function() {
        console.log('Working on index', i);
        console.log('list[i] :', list[i]);
      }, 100);
    })(i);
  }

  console.log('End of function');
}

doWork(myList);

myList[4] = null;

解决方案是将文件(或列表/索引对)本身括起来,以使其在您的上下文中保持事件状态:

let myList = [1, 2, 3, 4, 5];

function doWork(list) {
  console.log('Start of function');
  
  for (let i = 0; i < list.length; i++) {
    (function(num) {
      setTimeout(function() {
        console.log('Num :', num);
      }, 100);
    })(list[i]);
  }

  console.log('End of function');
}

doWork(myList);

myList[4] = null;

关于javascript - 上传多个文件时出现异步问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45841841/

相关文章:

c# - Mongodb C# 驱动程序 : view MQL bson query generated from linq

javascript - 为什么我在 Jasmine 1.3.x 中的 AngularJS 异步测试不起作用?

javascript - Jingle 和 webRTC 之间的互操作性

javascript - 在 HTML 组件旁边放置一个标签

javascript - 使用 select2 ajax 发送 data-* 属性

mysql - 在 Node JS Handlebars JS MySql 中发送值

php - 在PHP中获取嵌套数组的算法

javascript - 拒绝在框架中显示 'http://127.0.0.1:8000/files/xxx.pdf',因为它在 Node Express API 中将 'X-Frame-Options' 设置为 'sameorigin'

node.js - 在同构 React 驱动的应用程序中,在 Node 中分离客户端和服务器代码的好做法是什么?

node.js - MongoDB:使用 $geoNear 并非所有结果都从查询返回