2021年9月29日

nestJs-控制器

作者 rourou

nestJs创建的项目,src目录下包含一下几个核心文件:

  • main.ts 应用程序入口文件,创建nest实例(NestFactory)
  • .module 应用程序根模块(类、构造函数等注入)
  • .seveice 单个方法的基本服务(处理业务逻辑)
  • .controller 带有单个路由的基本控制器示例(返回数据处理)
  • .controller.spec 基本控制器的单元测试

在.controller.文件中处理。控制器应处理 HTTP 请求并将更复杂的任务委托给 providers(提供者)。

负责处理传入的请求和向客户返回响应

路由

@Controller()定义基本的控制器,括号内可写入路由前缀路径;eg:@Controller(‘cats’)

@Get()/@Post()/… HTTP 请求方法装饰器。

括号内可写入路由前缀路径;eg:@Get(‘findall’)

请求的路径由可选的控制由路径前缀和请求方法装饰器中声明的任何路径字符串;eg:cats/findall

request

访问客户端的请求细节.在处理函数的签名中使用 @Req() 装饰器

请求处理函数中注入 @Res()或 @Response() 时,必须通过调用 response 对象(例如,res.json(…) 或 res.send(…))发出某种响应,否则 HTTP 服务器将挂起

@Request(),@Req()req
@Response(),@Res()*res
@Next()next
@Session()req.session
@Param(key?: string)req.params/req.params[key]
@Body(key?: string)req.body/req.body[key]
@Query(key?: string)req.query/req.query[key]
@Headers(name?: string)req.headers/req.headers[name]
@Ip()req.ip
@HostParam()req.hosts

资源

Nest 为所有标准的 HTTP 方法提供了相应的装饰器:@Put()、@Delete()、@Patch()、@Options()、以及 @Head()。此外,@All()

状态码

@HttpCode(…) 装饰器可以修改状态码。通常状态码不是固定的,而是取决于各种因素。在这种情况下,您可以使用类库特有(library-specific)的 response (通过 @Res()注入 )对象(或者在出现错误时,抛出异常)。

Headers

指定header头时可以使用@Header(‘xxx’, ‘xxx’)装饰器

重定向

@Redirect()装饰器, 参数url 和 statusCode。 如果省略,则 statusCode 默认为 302。动态的处理状态码以及url。可通过对象处理:{ “url”: string, “statusCode”: number }返回的值将覆盖传递给 @Redirect()装饰器的所有参数,例子如下

@Get('docs')
@Redirect('https://docs.nestjs.com', 302)
getDocs(@Query('version') version) {
  if (version && version === '5') {
    return { url: 'https://docs.nestjs.com/v5/' };
  }
}

路由参数

接受动态数据(dynamic data)作为请求的一部分时,可通过在路由路径中添加路由参数标记,获取值。使用@Param()装饰器获取值。也可以在装饰器中添加读取参数直接获取

@Get(':id')
findOne(@Param() params): string {
  console.log(params.id);
  return `This action returns a #${params.id} cat`;
}

子域路由

@Controller 装饰器可以接受一个 host 选项,以要求传入请求的 HTTP 主机匹配某个特定值。可以使用 @HostParam() 装饰器访问以这种方式声明的主机参数,该装饰器应添加到方法签名中

@Controller({ host: ':account.168.40.170' })
export class AppController {
  constructor(private readonly appService: AppService) {}
  @Post('HostParam')
  HostParam(@HostParam('account') account): string {
    console.log(account);
    return account;
  }
}

请求负载

通过使用 TypeScript 接口(Interface)或简单的类(Class)来定义 DTO 模式,可以限制前台提交的数据。

/*
  create-cat.dto.ts
*/
export class CreateCatDto {
  readonly name: string;
  readonly age: number;
  readonly breed: string;
}
/* cats.controller.ts */

@Post()
async create(@Body() createCatDto: CreateCatDto) {
  return 'This action adds a new cat';
}