【发布时间】:2021-05-22 01:16:09
【问题描述】:
所以我正在开发一个函数,该函数接收从前端的用户输入获取的文件数据数组。这些文件位于req.files.fileInput 中,这是一个文件数据对象数组。
在该函数中,我将遍历该文件数据对象数组以逐个上传。基本上这个想法是,开始上传,如果上传失败,然后通过返回一个带有success: false的对象来停止整个事情。如果所有文件都成功上传,则返回一个带有````success: true```的最终对象。
现在第一个文件被上传并显示带有success: true 的返回对象。而且循环甚至不会转到第二个文件。
req.files 的外观如下:
{
fileInput: [
{
name: '1.jpg',
data: <Buffer ff d8 ff e0 00 10 44 6f 02 10 00 00 ... 123608 more bytes>,
size: 123658,
encoding: '7bit',
tempFilePath: '',
truncated: false,
mimetype: 'image/jpeg',
md5: '3b8e39e3ed9a26edda2f3713fcb95f4a',
mv: [Function: mv]
},
{
name: '2.jpg',
data: <Buffer ff d8 ff e0 00 10 4a 46 49 46 00 02 00 00 00 ... 165835 more bytes>,
size: 165885,
encoding: '7bit',
tempFilePath: '',
truncated: false,
mimetype: 'image/jpeg',
md5: '35021d52e7d634042e604fcabf35ccf4',
mv: [Function: mv]
}
]
}
这是接收req.files.fileInput数组的函数:
const uploadFunc = ( fileDataArr ) => {
for ( let eachFile of fileDataArr ) {
const fileName = eachFile.name;
const uploadPath = `./images/${fileName}`;
return new Promise( ( resolve, reject ) => {
eachFile.mv( uploadPath, function ( err ) {
if ( err ) {
return resolve( {
success: false,
message: 'Something went wrong. Please try again!',
data: null
});
}
});
return resolve( {
success: true,
message: 'Files Uploaded Successfully',
data: null
});
});
}
};
uploadFunc(req.files.fileInput);
【问题讨论】:
-
您试图让您的
uploadFunc()函数返回与fileDataArr中的文件一样多的次数,但一个函数只能返回一次 - 在这种情况下,它会在第一次返回循环的迭代,这意味着循环实际上在那里结束。 -
@IAmDranged 这种情况怎么办?
-
您可能可以将整个循环包装在 Promise 执行器函数中,并仅在所有文件实际完成上传时才解析 - 如果需要,使用本地状态变量跟踪迭代计数。请注意,您需要在
mv()回调函数中异步解析承诺,以便真正等到文件实际完成上传。 -
更简洁、更易读的方法是将您的代码转换为使用
async/await语法。这需要首先承诺mv()异步函数——即将它变成一个基于promise 的函数。如果您不熟悉它,请查看它。 -
如果可以,请提供一个答案,因为我不习惯 JS Promises :(
标签: javascript node.js express