您好,我正在尝试上传多个文件,文件写入正确。但我想将文件移动到 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/