如何将 multer-s3 的类型定义用于 req.file 而不是 multer 的类型定义

问题描述

我正在从 JS 迁移到 TS,并且在此过程中遇到了一些问题。我使用广为人知的 multer 包和自定义存储引擎 multer-s3 将传入的文件直接高效地流式传输到 AWS。

自定义存储引擎 multer-s3 提供了它自己的“文件属性定义,它扩展了 multer 的定义。 multer-s3 的 index.d.ts 文件看起来像这样(multer-s3 的完整类型定义可以在 here 中找到):

declare global {
    namespace Express {
        namespace MulterS3 {
            interface File extends Multer.File {
                bucket: string;
                key: string;
                acl: string;
                contentType: string;
                contentdisposition: null;
                storageClass: string;
                serverSideEncryption: null;
                Metadata: any;
                location: string;
                etag: string;
            }
        }
    }
}

每当我解析传入的文件时,multer 都会使用它自己的 File 定义,而不是 multer-s3 的定义,这会导致 location属性req.file 对象上不可用。

我现在的问题是:如何让 multer 使用 multer-s3 的文件定义而不是它自己的文件定义?在迁移到 typescript 之前,multer-s3 的“文件”类型定义中包含的所有属性都可以在 req.file 下访问 - 不幸的是,typescript 无法识别。到目前为止,我以某种方式通过在 Express.MulterS3.File 类型的请求接口上创建一个属性来使用一种解决方法

export default interface IRequest extends express.Request {
  processedFile?: Express.MulterS3.File;
}

然后,在解析中间件中,将 req.file 属性转换为 Express.MulterS3.File,这使得所需的属性可用:

export const acceptProfilePicUpload = async function (
  req: IRequest,res: express.Response,next: express.NextFunction
) {
  try {
    await new Promise((resolve,reject) => {
      multerUpload(req,res,(err: any) => {
        if (err) reject(err);
        else resolve(true);
      });
    });

    if (!req.file)
      throw new Error("file missing");

    req.processedFile = req.file as Express.MulterS3.File; // this is how I get TS to user multer-s3's type deFinitions - is there a better solution?    

    next();
  } catch (error) {
    console.log(error);
    next(error);
  }
};

但是,我不确定这是否是正确的方法,并希望在此问题上寻求您的帮助。我的目标是让 req.file 的类型为 Express.MulterS3.File 而不是 Express.Multer.File

也许你们中的一些人知道问题出在哪里,或者在打字稿中使用 multer-s3 和 multer 时自己遇到过。 任何帮助将不胜感激!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)