跳至主要內容

控制器

刘春龙原创...大约 6 分钟NodejsNestjs教程文档

控制器负责处理传入的 requests 并将 responses 返回给客户端。

控制器的目的是接收应用的特定请求。 routing 机制控制哪个控制器接收哪些请求。 通常,每个控制器都有不止一条路由,不同的路由可以执行不同的操作。

现在我们要创建一个全新的user(用户模块)

nest g resource ./modules/user

提示

可通过输入nest --help查看可用的 nest 命令:

当执行完毕该命令时,会出现如下提示

这里我选择REST API,后期会一一讲解,之后一直yes直到user模块生成,会出现✔ Packages installed successfully.,重新启动项目即可

现在我们打开user.controller.ts文件,如下:

import { Controller, Get, Post, Body, Patch, Param, Delete } from '@nestjs/common';
import { UserService } from './user.service';
import { CreateUserDto } from './dto/create-user.dto';
import { UpdateUserDto } from './dto/update-user.dto';

@Controller('user')
export class UserController {
  constructor(private readonly userService: UserService) {}

  @Post()
  create(@Body() createUserDto: CreateUserDto) {
    return this.userService.create(createUserDto);
  }

  @Get()
  findAll() {
    return this.userService.findAll();
  }

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

  @Patch(':id')
  update(@Param('id') id: string, @Body() updateUserDto: UpdateUserDto) {
    return this.userService.update(+id, updateUserDto);
  }

  @Delete(':id')
  remove(@Param('id') id: string) {
    return this.userService.remove(+id);
  }
}

程序自动帮我们生成了符合REST API规范的增、删、改、查接口,现在我们通过不同的请求方式去访问这5个路由地址

REST API简介


REST 指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是 RESTful。

RESTful是一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。

它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次。

RESTful接口规范是用于在前端与后台进行通信的一套规范。使用这个规范可以让前后端开发变得更加轻松。

适用场景

一个系统的数据库数据,展现的平台有PC端、移动端、app端、ios端。

前端工程师:都遵循RESTful编程规范

后端工程师:都遵循RESTful编程规范

最终结果:开发效率高,便于管理

可以用http或者https协议

数据传输的格式应该都用json格式

url链接规则

url链接中,不能有动词,只能有名词

并且对于一些名词,如果出现复数,那么应该在后面加s

比如:获取新闻列表,应该使用/news/,而不应该使用/get_news/

HTTP请求方式

GET:从服务器上获取资源。

POST:在服务器上新增或者修改一个资源。

PUT:在服务器上更新资源。(客户端提供所有改变后的数据)

PATCH:在服务器上更新资源。(客户端只提供需要改变的属性)

DELETE:从服务器上删除资源。

在我们上面的示例中,当向此端点发送 GET 请求时,Nest 将请求路由到我们用户定义的 findAll() 方法。 请注意,我们在这里选择的方法名称是完全任意的。 显然,我们必须声明一个方法来绑定路由,但 Nest 对所选择的方法名称没有任何意义。当请求打到findAll()时,我们看到了他调用了user.service.ts文件里的findAll()方法,

findAll() {
    return `This action returns all user`;
}

该方返回了一个字符串,因此我们在浏览器直接访问http://localhost:3000/user就能看到This action returns all user

说明

除了使用return 'This action returns all user';进行响应外,还可以使用库特定的(例如,Express)响应对象,它可以在方法处理程序签名(例如,findAll(@Res() response))中使用 @Res() 装饰器注入。 通过这种方法,你可以使用该对象公开的原生响应处理方法。 例如,对于 Express,你可以使用像 response.status(200).send() 这样的代码来构造响应。

@Get()
findAll(@Res() response) {
    return this.userService.findAll(response);
}

此时,我们在浏览器访问http://localhost:3000/user 也就能看到This action returns all user

请求对象

处理程序通常需要访问客户端 request 的详细信息。 Nest 提供对底层平台 请求对象 的访问(默认为 Express)。 我们可以通过将 @Req() 装饰器添加到处理程序的签名来指示 Nest 注入它来访问请求对象。

请求对象表示 HTTP 请求,并具有请求查询字符串、参数、HTTP 标头和正文的属性。 在大多数情况下,没有必要手动获取这些属性。 我们可以使用开箱即用的专用装饰器,例如 @Body()@Query()。 下面是提供的装饰器列表和它们代表的普通平台特定对象。

@Req()

获取请求数据

@Get()
findAll(@Req() req) {
    console.log(req);
}

测试:http://localhost:3000/useropen in new window

@Query()

获取请求数据中的qurey参数

@Get()
findAll(@Query() query) {
    console.log(query);
}

测试:http://localhost:3000/user?name=lclopen in new window

@Body()

获取请求数据中的body参数

@Post()
create(@Body() body) {
    console.log(body);
}

测试:POST http://localhost:3000/useropen in new window {name:lcl}

@Param()

获取请求数据中的Params参数

@Get(':id')
findOne(@Param() param) {
    console.log(param);
}

测试: http://localhost:3000/user/3open in new window

@Headers()

获取请求数据中请求头里的参数

@Headers()
findAll(@Headers() headers) {
    console.log(headers);
}

测试: http://localhost:3000/useropen in new window

标头

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

@Get()
@Header('Cache-Control', 'none')
findAll() {
    console.log(1);
}

状态码

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

@Post()
@HttpCode(204)
findAll() {
    console.log(1);
}

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

重定向

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

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

@Get("v1")
@Redirect('https://nest.nodejs.cn', 301)
findAllV1() {
    console.log(1);
}
上次编辑于:
贡献者: 刘春龙
评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v2.15.7