# 控制器

*.controller.ts

  • 概述:控制器负责处理传入的请求并向客户端返回响应
  • 控制器会根据路由控制去接受特定url的请求。
  • 使用cli创建控制器
nest g co controller_name --no-spec --flat

# 路由

  • 使用@Controller()装饰器,用于定义一个基本的控制器。可以传入可选的指定路由路径前戳。
/* test.controller.ts */
import { Controller, Get, Post } from '@nestjs/common'

@Controller('test') // 可选是否传入路由路劲前戳
export class TestController {

  @Get('list') // 监听 get /test/list
  getList() {}

  @Post() // 监听 Post /test
  addTest() {}
}

# 请求对象

  • 概述:处理客户端请求的详细信息,我们可以使用@Req()装饰器来指示Nest注入请求对象。
import { Controller, Get, Req } from '@nestjs/common'
import type { Request } from 'express'

@Controller('test')
export class TestController {

  @Get('list')
  getList(@Req() request: Request) {
    console.log(request.query)
  }
}

提示

利用express的类型定义,可以安装@types/express

# 参数装饰器

装饰器名称 简单描述
@Req() request对象
@Res() response对象
@Session() req.session
@Param(key?: string) req.params/req.params[key]
@Body 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处理了返回参数,如果在方法中注入了@Res则需要手动的调用res.json()或者res.send(),否则请求将会挂起。

# HTTP方法装饰器

  • 包含@Get(path?: string)@Post()@Put()@Delete()@Patch()@Options()@Head()@All()定义了一个处理所有方法的顶端。
  • 支持通配符
@Get('ab*')
findAll() {}

@Get(':id')
getDetail() {}

# 状态码

  • 默认情况下,响应的状态码始终为200,可以使用HttpCode(code: number)装饰器修改
@Post()
@HttpCode(204)
add() {}

# 头部信息

  • 指定响应头,可以使用@Header()装饰器
@Post()
@Header('content-type', 'applicatioin/json;utf-8')
add() {}
  • 重定向:
    1. 可以使用Redirect(url?: string, statusCode?: number = 302)装饰器,接受两个可选参数urlstatus
    2. 动态的返回重定向URL。可以通过返回特定形式的参数来覆盖Redirect()装饰器的参数
@Post()
@Redirect('https://www.baidu.com', 301)
add(@Body(id) id: string) {
  if (id === '1') {
    return { // 根据条件动态重定向,返回当前参数来覆盖Redirect()装饰器的参数
      url: 'https://www.google.com',
      stausCode: 301
    }
  }
}