NestJS管道的实例介绍

279 阅读4分钟

NestJS管道的例子

NestJS,一个管道只是一个带有@Injectable装饰器的类。在这篇文章中,我们将通过详细的例子来看看如何使用NestJS管道。

在这篇文章中,我们将通过实例来了解NestJS管道以及如何使用它们。

1 - 什么是管道?

你可以把管道看作是两个片段之间的连接媒介。就像我们在现实生活中使用管道一样,我们也可以在我们的应用环境中使用管道来做一些有用的事情。

在NestJS的上下文中,管道只是一个带有**@Injectable装饰器注释的类。如果你想了解更多关于@Injectable**注解的信息,请参考关于NestJS Providers的帖子。

一个管道类应该实现PipeTransform接口,管道有两种典型的用途:

  • 转换- 这基本上是将一些输入数据转换为另一种格式。例如,将字符串转换为整数。
  • 验证- 在这里,我们可以对输入数据进行评估,如果输入是有效的,就让它通过。否则,抛出一个异常。

简而言之,管道充当了传入请求和实际请求处理程序之间的中介。

转换验证的情况下,管道对路由处理器的参数进行操作。基本上,NestJS将管道放在方法调用之前,管道接收用于路由处理的参数。

一旦转换验证完成,路由处理程序就会被调用,并有可能被转换或验证的参数。

NestJS有一堆内置的管道,我们将在这篇文章的更多部分进行研究。然而,我们也可以创建自定义管道。

2 - 内置的NestJS管道

有几个内置的NestJS管道是开箱即用的:

  • ValidationPipe
  • ParseIntPipe
  • ParseBoolPipe
  • ParseFloatPipe
  • ParseArrayPipe
  • 解析Enum管道
  • 解析UUID管道
  • 默认值管道

所有这些管道都是NestJS公共包的一部分。

3 - 绑定管道

为了使用一个内置的管道,我们需要将一个管道类的实例绑定到路由处理程序。

让我们以下面的ParseIntPipe为例:

@Get("/pipe-demo/:id")
pipeDemo(@Param('id', ParseIntPipe) id: number) {
   console.log(id);
}

在这里,我们将ParseIntPipe与一个特定的路由处理程序联系起来。基本上,这个管道将在路由处理程序之前运行,并确保传入的请求参数ID是一个整数。

如果参数是一个字符串(例如**http://localhost:3000/pipe-demo/abc)**,我们会得到一个验证错误:

{"statusCode":400,"message":"Validation failed (numeric string is expected)","error":"Bad Request"}

在这种情况下,该异常将阻止console.log语句的执行。你可以想象,这可以防止下游代码中的问题,在这些代码中,输入应该是一个整数。

注意这里我们传递的是类名ParseIntPipe而不是一个对象。基本上,我们通过启用依赖注入将实例化的工作留给了框架。 然而,我们也可以传递一个就地的实例。如果我们想定制内置管道的某些方面的行为,这就特别有用:

@Get("/pipe-demo/:id")
pipeDemo(@Param('id', new ParseIntPipe({ errorHttpStatusCode: HttpStatus.NOT_ACCEPTABLE })) id: number) {
   console.log(id);
}

在上面的例子中,我们将错误代码调整为Http Status NOT_ACCEPTABLE而不是BAD_REQUEST。 为了做到这一点,我们使用了ParseIntPipe的一个就地实例。

4 - 使用其他管道的例子

绑定其他与解析相关的管道的工作原理与此类似。我们可以使用这些管道在路由处理程序的上下文中进行验证。它们可以在路由参数、查询参数以及请求体上工作。

请看下面的例子:

@Get("/pipe-demo")
pipeDemo(@Query('id', ParseIntPipe) id: number) {
  console.log(id);
}

在这里,我们对查询参数而不是路由参数使用了ParseIntPipe。我们还可以使用其他类型的管道,如下所示:

@Get("/pipe-demo")
pipeDemo(@Query('id', ParseUUIDPipe) id: string) {
  console.log(id);
}

在上面的例子中,我们使用ParseUUIDPipe。同样地,我们也可以使用ParseBoolPipe

@Get("/pipe-demo")
pipeDemo(@Query('login-status', ParseBoolPipe) id: boolean) {
  console.log(id);
}

总结

至此,我们已经成功地了解了NestJS管道和基本用法。管道可以用于高级情况,如内置的NestJS验证管道。我们还可以创建我们自己的NestJS管道。 如果你有任何意见或疑问,请随时在下面的评论区提及。