【Nest】控制器

2021/09/06 18:19:00

控制器负责处理传入的请求和向客户端返回响应。

路由(请求路径)

Nest 中的路由通过 @Controller() 装饰器的参数和响应装饰器参数(如@Get())决定。

下面例子定义了一个路径为 /cats/nameget 请求,访问这个路径会返回 hello word

import { Controller, Get } from "@nestjs/common";

@Controller("cats")
export class AppController {
  @Get("name")
  getHello(): string {
    return "hello word";
  }
}

处理响应

为不同请求设置处理程序

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

此外,@All() 用于定义一个处理所有 HTTP 请求方法的处理程序。

下面例子定义了一个路径为 /cats/namepost 请求,访问这个路径会返回 hello post

import { Controller, Post } from "@nestjs/common";

@Controller("cats")
export class AppController {
  @Post("name")
  getHello(): string {
    return "hello post";
  }
}

设置状态码

用 @HttpCode() 装饰器修改响应状态码。

import { Controller, All, HttpCode } from "@nestjs/common";

@Controller("cats")
export class AppController {
  @All("name")
  @HttpCode(202)
  getHello(): string {
    return "hello word";
  }
}

Nest 提供的装饰器及其代表的底层平台特定对象的对照列表

在请求处理函数中注入 @Res() 或 @Response() 时,会将 Nest 置于该处理函数的特定于库(Library-specific mode)的模式下,并负责管理响应,这样做时,必须通过调用 response 对象(例如,res.json() 或 res.send())发出某种响应,否则 HTTP 服务器将挂起。

装饰器底层对象(node-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

下面例子在路由处理程序中访问 node-http 模块的 request、req.query、req.ip 属性。

import { Controller, Get, Req, Query, Ip } from '@nestjs/common';
import { AppService } from './app.service';

@Controller('cats')
export class AppController {
  constructor(private readonly appService: AppService) { }

  @Get('name')
  getHello(
    @Req() request,
    @Query() query,
    @Ip() ip,
  ): string {
    console.log(query, ip)
    return this.appService.getHello();
  }
}