我正在使用node.js中的图像上传功能,其中我有一个包含多个文件对象的数组,并且在每个数组中,默认存储文件路径是图像和优先级状态。喜欢这个
var imagesArr = [
{path: "./img/img_3.jpg", priority: 3}, //exist
{path: "./img/img_1.jpg", priority: 1}, //exist
{path: "./img/img_5.jpg", priority: 5}, //exist
{path: "./img/img_2.jpg", priority: 2}, //exist
{path: "./img/img_4.jpg", priority: 4}, //exist
{path: "./img/img_7.jpg", priority: 7}, //not exist
{path: "./img/img_6.jpg", priority: 6}, //not exist
];
首先,我需要根据优先级对数组进行排序。所以我已经做了这个以获得新的排序数组。
var sortedFileArr = imagesArr.sort(function(a, b) {return (a.priority > b.priority) ? 1 : ((b.priority > a.priority) ? -1 : 0);} );
现在,我需要迭代数组以检查具有给定路径的每个文件是否存在。如果是,则它将上传到新的目标路径。如果不是,那么我重新检查该文件最多3次。如果没有,那么我需要发送没有找到文件的响应以及重试计数。到目前为止我已经完成了这项工作并且工作正常。我正在使用异步循环进行迭代。
var resp = [];
async.each(sortedFileArr, function(fileArrItem, outerCallback) {
var searchCount = 0, fileFoundStatus = false, retryCount = 0;
while(searchCount <= 2) {
if(fs.existsSync(fileArrItem.path)) {
fileFoundStatus = true;
retryCount = searchCount;
break;
} else {
fileFoundStatus = false;
retryCount = searchCount+1;
}
searchCount++;
}
if(fileFoundStatus) {
let imgName = fileArrItem.path.split("/")[2];
fs.createReadStream(fileArrItem.path).pipe(fs.createWriteStream("./newImg/"+imgName));
resp.push({name: fileArrItem.path, status: "Found", retryCount: retryCount})
outerCallback();
} else {
resp.push({name: fileArrItem.path, status: "Not Found", retryCount: retryCount})
outerCallback();
}
}, function(err){
console.log(resp);
})
现在,我的问题是,我可以用其他简单的方式或更优化的方式来做到这一点。提前感谢您的任何帮助。