asynchronous问题,同时上传多个文件

嗨,我想上传多个文件,文件写入是适当的。 但我想将文件移动到mongo网格fs中,第一个文件只是正确移动文件的其余部分不会移动到网格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"); 

这一个我已经试过闭包function,即使我已经尝试创build单独的function,但也有同样的结果(只有一个文件插入和解除链接)。

在这种情况下,我必须做什么来存储在网格中的所有文件,并从临时文件夹中取消链接?

这是我的猜测。 由于你的调用被延迟了,你的函数结束了,文件列表可能被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; 

其实问题是与gridFs连接,文件在循环中上传,网格连接是up,写入第一个文件,循环继续并行。 一旦连接从网格上,它应该closures,然后再插入另一个文件,必须重新连接下一次正常。

这是工作代码检查它:

 var files = req.files.fileData[0]; var count = ""; if(files instanceof Array){ count = files.length; } else{ count = 1; } if(!fs.existsSync('./attachments')){ console.log("Creating the attachments folder."); fs.mkdir('./attachments'); } function moveToGrid(gridArr,callback){ var uniqId = gridArr.uniqId, filePath = gridArr.targetPath, fileName = gridArr.fileName, fileType = gridArr.fileType; console.log(filePath+' '+fileName+' '+fileType + ' '+uniqId); mongoose.connect(configSettings.mongodb.ip, configSettings.mongodb.databasename, configSettings.mongodb.port, function (err, succ){ var uploadResponse = function(uniqId){ // Delete the tmp file fs.unlink("./attachments/" + uniqId, function (err) { console.log(uniqId + ' ::temp file successfully deleted '); }); mongoose.connection.close(); console.log("=========request END time==========::::" + (new Date()).toString() + "::" +(new Date()).getMilliseconds() ); callback(); }; var id = new ObjectID(uniqId); new GridStore(mongoose.connection.db,id,fileName, 'w',{'content_type':'application/octet-stream'}).open(function(err, gs) { gs.writeFile(filePath, function(err) { if(err){ console.log("err : "+err); } gs.close(function(err) { uploadResponse(uniqId); }); }); }); }); } var recursive = function(gridArr){ function uploader(i){ if( i < gridArr.length ){ moveToGrid(gridArr[i], function(){ uploader(i+1) }); } else{ res.send("success"); } } uploader(0); } if(count > 1){ var gridArr = []; for(var i=0; i<files.length; i++){ (function(i){ var singleFile = files[i]; var fileData = JSON.parse(singleFile.name); var fileName = fileData.fileName; var fileType = singleFile.type; var uniqId = fileData.attachmentId; var targetPath = "./attachments/" + uniqId; var tmp_path = singleFile.path; fs.readFile(tmp_path,function(err,data){ fs.writeFile(targetPath,data,function(err){ if(!err){ gridArr.push({"uniqId":uniqId, "targetPath":targetPath, "fileName":fileName, "fileType":fileType}); count --; if(count == 0){ recursive(gridArr); } } }); }); }(i)); } } else{ var gridArr = []; var singleFile = files; var fileData = JSON.parse(singleFile.name); var fileName = fileData.fileName; var fileType = singleFile.type; var uniqId = fileData.attachmentId; var targetPath = "./attachments/" + uniqId; var tmp_path = singleFile.path; fs.readFile(tmp_path,function(err,data){ fs.writeFile(targetPath,data,function(err){ if(!err){ gridArr.push({"uniqId":uniqId, "targetPath":targetPath, "fileName":fileName, "fileType":fileType}); count --; if(count == 0){ recursive(gridArr); } } }); }); } 

使用这个代码,我们可以插入多个文件到mongo gridFs ..希望这有助于!

简短的回答在这里学习如何循环内的asynchronous函数

 (function loop(i) { if(i==4) return setTimeout(function() { console.log('Working on index', i); loop(++i) }, 1000); })(0); 

TL; DR https://mongodb.github.io/node-mongodb-native/api-generated/gridstore.html