Return 函数语句在 Express FileUpload .mv() 方法中使用后不会被触发
Return statement of a function doesn't get triggered after using it in Express FileUpload .mv() method
我正在尝试通过 Express File Upload
上传文件,但在调用它的函数中得到了一个未定义的值。
我有这个功能可以检查用户选择的是单个文件还是多个文件。为简单起见,我将在单个文件上传中展示问题。也就是说 req.files.fileInput
是一个对象而不是对象数组。
代码如下:
const fileCheck = ( file ) => {
if ( Array.isArray( file ) ) {
// ignore this part of the if block as I'm testing it out with single file upload
console.log( 'THE USER WANTS TO UPLOAD MULTIPLE FILES' );
} else if ( typeof file === 'object' ) {
console.log( 'THE USER WANTS TO UPLOAD A SINGLE FILE' );
const uploadPath = `./resources/images/${file.name}`;
file.mv( uploadPath, function ( err ) {
if ( err ) {
console.error( err );
return {
success: false,
message: 'Something went wrong. Please upload again!',
data: null
};
}
return {
success: true,
message: 'File Uploaded Successfully!',
data: file.name
};
});
}
};
const { success, message, data } = fileCheck(req.files.fileInput);
// IT IS UNDEFINED BUT IT IS SUPPOSED TO BE TRUE IF FILE UPLOAD IS SUCCESSFUL.
// IT IS ALSO UNDEFINED INSTEAD OF FALSE IF THERE IS AN ERROR IN FILE UPLOAD.
console.log( success );
我收到这个错误:
TypeError: Cannot destructure property 'success' of '(intermediate value)' as it is undefined.
似乎 fileCheck
函数的 return 语句在 .mv() 方法中使用后未被触发。这可能是什么原因?我能做些什么来解决它?
您只是 return 从 file.mv()
回调函数中调用,您还需要 return file.mv()
,以便它渗透到您的 fileCheck
函数。
这样做
return file.mv(uploadPath, function (err) {
if (err) {
console.error(err);
return {
success: false,
message: 'Something went wrong. Please upload again!',
data: null,
};
}
return {
success: true,
message: 'File Uploaded Successfully!',
data: file.name,
};
});
编辑
不幸的是,file.mv()
似乎没有 return 默认情况下其回调函数的结果。
像这样考虑 returnfileCheck
的承诺
const fileCheck = ( file ) => {
if ( Array.isArray( file ) ) {
console.log( 'THE USER WANTS TO UPLOAD MULTIPLE FILES' );
} else if ( typeof file === 'object' ) {
console.log( 'THE USER WANTS TO UPLOAD A SINGLE FILE' );
const uploadPath = `./resources/images/${file.name}`;
return new Promise((resolve, reject) =>
file.mv( uploadPath, function ( err ) {
if ( err ) {
console.error( err );
return reject({
success: false,
message: 'Something went wrong. Please upload again!',
data: null
});
}
return resolve({
success: true,
message: 'File Uploaded Successfully!',
data: file.name
});
});
}
};
并像这样使用 fileCheck
const { success, message, data } = await fileCheck(req.files.fileInput);
console.log( success );
注意: 您必须在调用 fileCheck
的地方创建父函数 async
才能使用 await
我正在尝试通过 Express File Upload
上传文件,但在调用它的函数中得到了一个未定义的值。
我有这个功能可以检查用户选择的是单个文件还是多个文件。为简单起见,我将在单个文件上传中展示问题。也就是说 req.files.fileInput
是一个对象而不是对象数组。
代码如下:
const fileCheck = ( file ) => {
if ( Array.isArray( file ) ) {
// ignore this part of the if block as I'm testing it out with single file upload
console.log( 'THE USER WANTS TO UPLOAD MULTIPLE FILES' );
} else if ( typeof file === 'object' ) {
console.log( 'THE USER WANTS TO UPLOAD A SINGLE FILE' );
const uploadPath = `./resources/images/${file.name}`;
file.mv( uploadPath, function ( err ) {
if ( err ) {
console.error( err );
return {
success: false,
message: 'Something went wrong. Please upload again!',
data: null
};
}
return {
success: true,
message: 'File Uploaded Successfully!',
data: file.name
};
});
}
};
const { success, message, data } = fileCheck(req.files.fileInput);
// IT IS UNDEFINED BUT IT IS SUPPOSED TO BE TRUE IF FILE UPLOAD IS SUCCESSFUL.
// IT IS ALSO UNDEFINED INSTEAD OF FALSE IF THERE IS AN ERROR IN FILE UPLOAD.
console.log( success );
我收到这个错误:
TypeError: Cannot destructure property 'success' of '(intermediate value)' as it is undefined.
似乎 fileCheck
函数的 return 语句在 .mv() 方法中使用后未被触发。这可能是什么原因?我能做些什么来解决它?
您只是 return 从 file.mv()
回调函数中调用,您还需要 return file.mv()
,以便它渗透到您的 fileCheck
函数。
这样做
return file.mv(uploadPath, function (err) {
if (err) {
console.error(err);
return {
success: false,
message: 'Something went wrong. Please upload again!',
data: null,
};
}
return {
success: true,
message: 'File Uploaded Successfully!',
data: file.name,
};
});
编辑
不幸的是,file.mv()
似乎没有 return 默认情况下其回调函数的结果。
像这样考虑 returnfileCheck
的承诺
const fileCheck = ( file ) => {
if ( Array.isArray( file ) ) {
console.log( 'THE USER WANTS TO UPLOAD MULTIPLE FILES' );
} else if ( typeof file === 'object' ) {
console.log( 'THE USER WANTS TO UPLOAD A SINGLE FILE' );
const uploadPath = `./resources/images/${file.name}`;
return new Promise((resolve, reject) =>
file.mv( uploadPath, function ( err ) {
if ( err ) {
console.error( err );
return reject({
success: false,
message: 'Something went wrong. Please upload again!',
data: null
});
}
return resolve({
success: true,
message: 'File Uploaded Successfully!',
data: file.name
});
});
}
};
并像这样使用 fileCheck
const { success, message, data } = await fileCheck(req.files.fileInput);
console.log( success );
注意: 您必须在调用 fileCheck
的地方创建父函数 async
才能使用 await