如何在NestJS控制器的FileInterceptor配置中读取.env的DEST变量
报错原因
类装饰器@UseInterceptors的执行时机早于控制器类的实例化阶段,此时通过构造函数注入的ConfigService实例还未完成初始化,因此无法在装饰器的静态配置对象中直接调用注入实例读取配置。
可行实现方案
方案1:直接读取process.env(最简方案)
Nest的ConfigModule在应用启动时会自动将.env文件内的变量挂载到process.env全局对象上,无需依赖注入的ConfigService实例即可直接读取:
@UseInterceptors(FileInterceptor('file', { storage: diskStorage({ destination: process.env.DEST , filename: (req, file, cb) => { const filename: string = path.parse(file.originalname).name.replace(/\s/g, '') const extension: string = path.parse(file.originalname).ext cb(null, `${filename}${extension}`) } }) }))
方案2:通过请求上下文获取ConfigService(规范方案,适配自定义配置逻辑)
如果你的配置存在加密、类型转换等自定义逻辑,必须通过ConfigService读取,可以利用diskStorage的destination支持传入回调函数的特性,从请求对象的应用上下文获取ConfigService实例:
@UseInterceptors(FileInterceptor('file', { storage: diskStorage({ destination: (req, file, cb) => { // 从请求挂载的应用实例中获取已经初始化完成的ConfigService const configService = req.app.get(ConfigService); const destPath = configService.get<string>('DEST'); cb(null, destPath); }, filename: (req, file, cb) => { const filename: string = path.parse(file.originalname).name.replace(/\s/g, '') const extension: string = path.parse(file.originalname).ext cb(null, `${filename}${extension}`) } }) }))
内容的提问来源于stack exchange,提问作者Med
相关产品推荐
相关产品推荐

