【问题标题】:Nest.js - create Injectable pipe with configNest.js - 使用配置创建可注入管道
【发布时间】:2021-08-27 15:47:25
【问题描述】:

管道有两种使用方式

@Param('foo', MyPipe) 在框架中创建MyPipe

或者我可以@Param('foo', new MyPipe())

解决方案 1 使我能够使用我需要的 @Injectable(例如,我注入 db 以从数据库中解析用户)

但是,我无法访问构造函数,因此无法配置管道。

在场景 2 中我可以配置它,但我不能使用 Injectable

有没有办法在这个范围内使用一些工厂,所以我可以像在模块中创建它一样构造管道?

【问题讨论】:

  • 你需要做什么样的配置?
  • 任何排序。我的案例是管道从数据库中解析模型。例如,如果用户不存在,我希望它可以选择抛出。

标签: node.js nestjs


【解决方案1】:

假设您有一个路由 'users/:userId' 并且您想将 userId 自动转换为用户模型。

步骤 1

通过命令创建管道

nest g pipe your-module/pipes/pipe-name/pipe-name

管道已创建,但管道不是 Nest 应用程序的依赖注入系统的完整部分。

第二步

通过将管道添加到控制器模块的提供者列表中,使其成为DI系统的一部分。

假设它的 UserModule


@Module({
  imports: [],
  constrollers: [UserController]
  providers: [PipeNamePipe]
})
class UserModule {}

第三步

在它的构造函数中注入管道需要的任何服务也是 UserModule 的一部分,或者确保提供程序在应用程序中全局可用

例如让我们把 AuthService 本来是 AuthModule 的一部分,在 UserModule 中不可用,所以我们将通过 providers 数组注入它。

@Module({
  imports: [],
  constrollers: [UserController]
  providers: [PipeNamePipe, AuthService]
})
class UserModule {}

第三步

让我们完成 PipeNamePipe 的实现。

记住管道可以返回任何值。它可以是 Promise、Observable 或静态值。例如,我们将返回承诺。

@Injectable()
class PipeNamePipe implments PipeTransform {

  construtor(private authService: AuthService){}

  transform(value: any): Promise<User> {
    return this.authService.findUser(value);
  }

}

第四步

在您的控制器中,只需将管道传递给参数

@Controller('users')
class UserController {
  
  @Get(':userId')
  show(
    @Param('userId', PipeNamePipe) user: User
  ) {
   // the value of userId will be converted to user instance through auth service.
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多