控制器
控制器负责处理传入的 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个路由地址
- 查询所有数据(GET 请求方式) : http://localhost:3000/user
- 查询一条数据(GET 请求方式): http://localhost:3000/user/1
- 增加一条数据(POST 请求方式) : http://localhost:3000/user
- 修改一条数据(PUT 请求方式) : http://localhost:3000/user/1
- 删除一条数据(DELETE 请求方式) : http://localhost:3000/user/1
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);
}
findAll(response) {
response.status(200).send(`This action returns all user`);
}
此时,我们在浏览器访问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);
}
@Query()
获取请求数据中的qurey参数
@Get()
findAll(@Query() query) {
console.log(query);
}
测试:http://localhost:3000/user?name=lcl
@Body()
获取请求数据中的body参数
@Post()
create(@Body() body) {
console.log(body);
}
测试:POST http://localhost:3000/user {name:lcl}
@Param()
获取请求数据中的Params参数
@Get(':id')
findOne(@Param() param) {
console.log(param);
}
测试: http://localhost:3000/user/3
@Headers()
获取请求数据中请求头里的参数
@Headers()
findAll(@Headers() headers) {
console.log(headers);
}
测试: http://localhost:3000/user
标头
要指定自定义响应标头,你可以使用 @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);
}