Nest - 控制器controller

109 阅读1分钟

1. 什么是controller ?

controller的目的是为请求服务做好路由的响应

@Get @Post 等装饰器下面的函数名称可随意取,比如下面的create函数名

比如下面的cats.controller.ts

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

@Controller('cats')
export class CatsController {
  @Post(’/create')
  create(): string {
    return 'This action adds a new cat';
  }

  @Get()
  findAll(): string {
    return 'This action returns all cats';
  }

  @Get(':id') // 路由参数形式
  findOne(@Param('id') id: string): string {
    return `This action returns a #${id} cat`;
  }
}

假设访问服务的域名与端口为 http://localhost:3669

2. 路由通配符#

也支持基于模式的路由。 例如,星号用作通配符,将匹配任何字符组合。


@Get('ab*cd')
findAll() {
  return 'This route uses a wildcard';
}

'ab*cd' 路由路径将匹配 abcdab_cdabecd 等。 字符 ?+* 和 () 可以在路由路径中使用,并且是它们对应的正则表达式的子集。 连字符 (-) 和点 (.) 由基于字符串的路径逐字解释。

仅 express 支持路由中间的通配符, fastify 不支持

3. 如何处理请求的相关数据

比如请求对象request,响应对象response,query, param 等

它们无需特殊对待,仅在相关函数(就是@Get等下面的函数)的参数使用Nest的装饰器就可

Nest提供了装饰器列表和它们代表的普通平台特定对象。

@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

 为了与跨底层 HTTP 平台(例如 Express 和 Fastify)的类型兼容,Nest 提供了 @Res() 和 @Response() 装饰器。 @Res() 只是 @Response() 的别名。 两者都直接暴露底层原生平台 response 对象接口。 使用它们时,你还应该导入底层库(例如 @types/express)的类型以充分利用它们。

请注意,当你在方法处理程序中注入 @Res() 或 @Response() 时,你将 Nest 放入该处理程序的 库特定模式 中。你必须通过调用 response 对象(例如,res.json(...) 或 res.send(...))来触发某种响应,否则 HTTP 服务器将挂起。

比如下面的代码,当使用了@Res()后,必须通过res.json(...) 或 res.send(...))返回,不可通过return 的形式

 @Get()
    findAll(@Res() res) {
        res.send(this.catService.findAll())
        // return this.catService.findAll(); // 使用了@Res,该方式不可
    }

4. 状态码#

如前所述,默认情况下响应 状态码 始终为 200,但 POST 请求除外,其为 201。 我们可以通过在处理程序级别添加 @HttpCode(...) 装饰器更改。


@Post()
@HttpCode(204)
create() {
  return 'This action adds a new cat';
}

提示从 @nestjs/common 包中导入 HttpCode

通常,你的状态代码不是静态的,而是取决于各种因素。 在这种情况下,你可以使用库特定的 response(使用 @Res() 注入)对象(或者,如果出现错误,则抛出异常)。
通过response.status 更改,如下

response
    .status(HttpStatus.OK)
    .send(`use ${HttpStatus.CREATED} http status`)

5. 标头#

要指定自定义响应标头,你可以使用 @Header() 装饰器或库特定的响应对象(并直接调用 res.header())。


@Post()
@Header('Cache-Control', 'none')
create() {
  return 'This action adds a new cat';
}

提示从 @nestjs/common 包中导入 Header

6. 重定向#

要将响应重定向到特定 URL,你可以使用 @Redirect() 装饰器或库特定的响应对象(并直接调用 res.redirect())。

@Redirect() 有两个参数,url 和 statusCode,两者都是可选的。 如果省略,statusCode 的默认值为 302 (Found)。


@Get()
@Redirect('https://nest.nodejs.cn', 301)

有时你可能希望动态确定 HTTP 状态代码或重定向 URL。 通过从具有以下形状的路由处理程序方法返回一个对象来执行此操作:


{
  "url": string,
  "statusCode": number
}

返回值将覆盖传递给 @Redirect() 装饰器的任何参数。 例如:


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

否则不可设置下方函数,导致redirect不管用。比如下面的redirect失效。

@Get()
@Redirect('https://nestjs.com', 301)
rootFn(@Res() response) {
    return 'this is cats root controller'
}