创建一个Controller(控制器)和routing(路由)
Controller(控制器)
Controller负责处理传入的请求, 并返回对客户端的响应。
Controller目的是接收应用的特定请求。routing控制哪个控制器接收哪些请求。通常,每个Controller有多个routing,不同的routing可以执行不同的操作.
为了创建一个基本的Controller,我们必须使用装饰器。装饰器将类与所需的元数据关联,并使Nest能够创建路由routing(将请求绑定到相应的Controller)。
使用使用NestCLI 创建Controller,
nest g controller cats
也可以简写为
nest g co cats
然后会看到
wujiayudeMacBook-Pro:hello-nest wjy$ nest g controller cats
CREATE /src/cats/cats.controller.spec.ts (479 bytes)
CREATE /src/cats/cats.controller.ts (97 bytes)
UPDATE /src/app.module.ts (322 bytes)
NestCLI创建了controller cats,并将cats注入到了app.module
- cats Controller
import { Controller, Get } from '@nestjs/common';
@Controller('cats')
export class CatsController {
}
- app.module
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { CatsController } from './cats/cats.controller';
@Module({
imports: [],
controllers: [AppController, CatsController],
providers: [AppService],
})
export class AppModule {}
routing(路由)
创建一个get路由
import { Controller, Get } from '@nestjs/common';
@Controller('cats')
export class CatsController {
@Get()
findAllCats() {
return '这里是Controller:cats的findAllCats方法~';
}
}
findAllCats() 方法的上面 @Get() 修饰符告诉 Nest 创建此路由路径的端点,并将每个相应的请求映射到此处理程序。由于我们为每个路由声明了前缀(cats),所以 Nest 会在这里映射每个 /cats 的 GET 请求。
这时候,在浏览器中输入:http://localhost:3000/cats
当客户端调用此端点时, Nest 将返回 200 状态码和解析的 JSON。
有两种可能的方法来处理响应:
- 标准方法
处理程序的处理方式与普通函数相同。当我们返回 JavaScript 对象或数组时, 它会自动转换为 JSON。当我们返回字符串, Nest 将只发送一个字符串而不尝试解析它。
响应状态代码在默认情况下总是 200, 除了 POST(响应状态码是201)。对于POST可以通过在处理程序层添加 @HttpCode(…) 装饰器来更改为200。 - 类库特有的
我们可以在函数签名通过 @Res() 注入类库特定的响应对象(等待学习:类库特有方式时细说)
注意: 禁止同时使用这两种方法。 Nest 检测处理程序是否正在使用 @Res()或 @Next(),如果两个方法都用了的话, 那么在这里的标准方式就是自动禁用此路由, 将不会得到想要的结果
请求细节(Request)
Nest默认使用express的特有类库,当需要访问客户端请求细节的时候,就可以强制使用@Req() 装饰器将请求对象注入处理程序。
将上面的cats改写成使用@Req()的形式:
import { Controller, Get, Req } from '@nestjs/common';
@Controller('cats')
export class CatsController {
@Get()
findAllCats(@Req() request) {
return '这里是Controller:cats的findAllCats方法~';
}
}
重新运行;输入http://localhost:3000/cats,正常返回。
装饰器 | 普通表达对象 |
---|---|
@Request() | req |
@Response() | res |
@Next() | next |
@Session() | req.session |
@Param(param?: string) | req.params / req.params[param] |
@Body(param?: string) | req.body / req.body[param] |
@Query(param?: string) | req.query / req.query[param] |
@Headers(param?: string) | req.headers / req.headers[param] |
对于常用的请求,除了GET还有POST,故…
再来一个POST路由
import { Controller, Get, Post } from '@nestjs/common';
@Controller('cats')
export class CatsController {
@Post()
createPost() {
return '这里是Controller:POST路由的cats的createPost方法~';
}
@Get()
findAllCats() {
return '这里是Controller:cats的findAllCats方法~';
}
}
重新运行,这里为了测试POST路由,所以使用Postman;
测试结果如下:
同样的,Nest以相同的方式提供其余的端点装饰器- @Put() 、 @Delete()、 @Patch()、 @Options()、 @Head()和 @All()。这些表示各自的HTTP请求方法。