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