注:此文仅记录博主初次学习nestjs之后的认识和理解,经验尚浅,文章内容仅供参考,如若有误,敬请指正。
控制层(controller)
此层职责:请求处理、业务调用、响应构造
对HTTP请求和响应报文结构不熟悉的可先阅读博客:https://blog.csdn.net/jw2268136570/article/details/103216174
- 配置:根模块(app.module.ts)中配置该控制器 controllers: [AppController],
0.单线程处理
Node.js
不遵循请求/响应多线程无状态模型,每个请求都由主线程处理。- 当请求完整周期内涉及到或可能涉及到异步操作时,可使用 async / await进行异步处理
1.请求处理
匹配请求
- 匹配处理:装饰器建立请求与controller的映射。
- 匹配规则:请求前缀prefix(class前缀、method前缀,支持通配符*) 、请求方法 GET/POST/…
- 动态url匹配
- 子域路由:根据请求的host来判断接口的调用权限
访问request
请求信息 | 装饰器方式访问 | 普通对象访问 |
---|---|---|
请求 | @Request() | req |
请求session | @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 | @Ip() | req.ip |
- 案例
import {
Controller, Get ,Req, Ip, Post,Query,Param,Body} from '@nestjs/common';
import {
AppService } from './app.service';
import {
Request, query } from 'express';
// import {CreateCatDto} from './DTO/catDto'
class CreateCatDto {
readonly name: string;
readonly age: number;
readonly breed: string;
}
@Controller()
export class AppController {
constructor(private readonly appService: AppService) {
}
@Get('test')
getHello(@Req() request: Request, @Query('name') name:String,@Ip() ip:String): string {
console.log(`请求参数name为(普通对象): ${
request.query['name']}`)
console.log(`请求参数name为(装饰器): ${
name}`)
console.log(`ip地址为(普通对象): ${
request.ip}`)
console.log(`ip地址为(装饰器): ${
ip}`)
return this.appService.getHello();
}
@Get(':id')
findOne(@Param('id') id: string) {
return `This action returns a #${
id} cat`;
}
@Post()
async create(@Body() createCatDto: CreateCatDto) {
// POST请求参数获取,@Body()配合DTO类
return 'This action adds a new cat';
}
}
2.业务调用
- 引入:import { AppService } from ‘./app.service’;
- 调用: return this.appService.getHello();
3.响应构造
访问response
响应信息 | 装饰器方式访问 | 普通对象访问 |
---|---|---|
响应 | @Response() @Res()* | res |
构造状态行
- 状态码:@HttpCode(204)
构造响应头
- 响应头:@Header(‘Cache-Control’, ‘none’)
构造响应体
- 返回页面/基本类型
- 返回对象/数组:自动序列化为JSON
重定向
- 基本语法:@Redirect(‘https://nestjs.com’)
- 动态url:controller方法 return { url: ‘https://docs.nestjs.com/v5/’ };