Nest.js控制器深度解析:路由与请求处理的高级特性

45 阅读2分钟

Nest.js是一个高效、可扩展的Node.js框架,用于构建服务器端应用程序。它使用TypeScript编写,结合了面向对象编程、函数式编程和函数响应式编程的最佳实践。在Nest.js中,控制器负责处理传入的请求并返回响应给客户端。

路由

在Nest.js中定义路由非常简单。控制器使用装饰器来定义路由路径和请求方法类型。

  • @Controller() 装饰器用于声明一个类作为控制器,并可以指定基础路径。
  • @Get()@Post()@Put()@Delete() 等装饰器则分别对应HTTP请求方法GET, POST, PUT, DELETE等,并可以指定特定的路径。

例如:

@Controller('cats')
export class CatsController {
  @Get()
  findAll(): string {
    return 'This action returns all cats';
  }
}
​

这里 CatsController处理所有到 /cats GET 请求,并返回一个字符串。

请求对象

Nest提供了许多装饰器来访问请求对象中的数据:

  • @Req() 或者直接使用快捷方式如:@Body()@Query(), 和 @Param() 来获取POST数据体、URL查询参数或者URL参数。

例如:

@PostMapping()
async create(@Body(new ValidationPipe()) createCatDto: CreateCatDto) {
  return this.catsService.create(createCatDto);
}
​

这里通过ValidationPipe自动验证传入数据并将其转换为CreateCatDto实例。

高级路由技巧

路径变量和状态码

你可以利用模式匹配在路由路径中设置变量(如 :id),并通过装饰器获取这些变量值。同时也能够设置特定HTTP状态码作为响应:

 @Get(':id')
 findOne(@Param('id') id: string): Cat {
   return this.catsService.findOne(id);
 }

 @Post()
 @HttpCode(204)
 create(): void {
   // ...
 }
​

异步处理

异步功能是现代Web框架不可或缺的一部分。在Nest.js中你可以轻松地返回Promise或Observable流:

@GetMapping('/async')
async findAllAsync(): Promise<Cat[]> {
    return await this.catsService.findAll();
}
​

拦截器与异常过滤

拦截其允许你拦截进出控制层方法之间流动信息流,在此过程添加额外逻辑(如日志记录、错误处理等):

UseInterceptors(LoggingInterceptor)
export class CatsController {}
​

异常过滤则允许捕获异常并根据需要进行自定义响应:

@Catch(HttpException)
export class HttpExceptionFilter implements ExceptionFilter {}
​

守卫与管道

守卫主要负责权限认证,在进入某个路由之前进行检查;管道则主要负责输入数据转换与验证工作:

UseGuards(RolesGuard)
export class CatsController {}

UsePipes(new ValidationPipe())
export class CreateCatDto {}
​

以上就是对 NestJS 控制层高级特性深度解析:从基本概念到异步支持再到更复杂场景下拦截其与管道等功能性组件运用都有所涉及,希望能够帮助开发者更好地理解和运用 NestJS 进行高效开发工作。