问题描述
我正在从 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 (将#修改为@)