gpt4 book ai didi

nestjs - 如何使用配置对象和依赖项创建 NestJs 管道?

转载 作者:行者123 更新时间:2023-12-01 23:57:20 25 4
gpt4 key购买 nike

我想将配置字符串传递给管道,但也想注入(inject)服务。 NesJs 文档描述了如何相互独立而不是一起执行这两项操作。举个例子:

管道.ts

@Injectable()
export class FileExistsPipe implements PipeTransform {

constructor(private filePath: string, db: DatabaseService) { }

async transform(value: any, metadata: ArgumentMetadata) {
const path = value[this.filePath];
const doesExist = await this.db.file(path).exists()
if(!doesExist) throw new BadRequestException();
return value;
}
}

Controller .ts

@Controller('transcode')
export class TranscodeController {

@Post()
async transcode (
@Body( new FileExistsPipe('input')) transcodeRequest: JobRequest) {
return await this.videoProducer.addJob(transcodeRequest);
}

基本上,我希望能够将属性名称传递给我的管道(例如'input'),然后让管道在请求中查找属性的值(例如 >const path = value[this.filePath]) 然后查看该文件是否存在于数据库中。如果没有,则抛出 Bad Request 错误,否则继续。

我面临的问题是我需要 NestJs 来注入(inject)我的 DataBaseService。对于当前示例,它不会,我的 IDE 给我一个错误,即 new FileExistsPipe('input') 只传递了一个参数,但期望有两个(例如 DatabaseService)。

有什么办法可以实现吗?

最佳答案

编辑:我刚刚查看了您的存储库(很抱歉之前没看到)。您的 DatabaseServiceFIleExistPipe 中是 undefined 因为您在 AppController 中使用管道。 AppController 将在 DatabaseModule 解析之前解析。如果您要在 AppController 中使用管道,您可以使用 forwardRef()DatabaseService 注入(inject)管道。这里的良好做法是在功能模块中提供功能 Controller 。

export const FileExistPipe: (filePath: string) => PipeTransform = memoize(
createFileExistPipe
);

function createFileExistPipe(filePath: string): Type<PipeTransform> {
class MixinFileExistPipe implements PipeTransform {
constructor(
// use forwardRef here
@Inject(forwardRef(() => DatabaseService)) private db: DatabaseService
) {
console.log(db);
}

async transform(value: ITranscodeRequest, metadata: ArgumentMetadata) {
console.log(filePath, this.db);
const doesExist = await this.db.checkFileExists(filePath);
if (!doesExist) throw new BadRequestException();
return value;
}
}

return mixin(MixinFileExistPipe);
}

您可以使用 Mixin 实现这一点。您无需导出 injectable 类,而是导出将返回此类的工厂函数。

export const FileExistPipe: (filePath: string) => PipeTransform = memoize(createFileExistPipe);

function createFileExistPipe(filePath: string) {
class MixinFileExistPipe implements PipeTransform {
constructor(private db: DatabaseService) {}
...
}

return mixin(MixinFileExistPipe);
}
  1. memoize 只是一个简单的函数,用于使用 filePath 缓存创建的混合管道。因此,对于每个 filePath,您只有该管道的一个版本。
  2. mixin 是从 nestjs/common 导入的辅助函数,它将包装 MixinFileExistPipe 类并使 DI 容器可用(因此 DatabaseService 可以注入(inject))。

用法:

@Controller('transcode')
export class TranscodeController {

@Post()
async transcode (
// notice, there's no "new"
@Body(FileExistsPipe('input')) transcodeRequest: JobRequest) {
return await this.videoProducer.addJob(transcodeRequest);
}
  1. 注入(inject) MongoDB 连接的混合守卫 a mixin guard injecting the MongoDB Connection
  2. 控制台显示正在记录的连接 the console shows the connection being logged

关于nestjs - 如何使用配置对象和依赖项创建 NestJs 管道?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62526828/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com