Nest Basic
Reference
- nestjs docs
- Day43】ChatGPT請教教我:NestJS!(二)- Controller & 裝飾器
- nest-docker-postgres-prisma 源码 NestJS, Redis and Postgres local development with Docker Compose 文字教程
说明
- 推荐使用
class作为DTO, 如class UserDto - 如果使用
TypeORM或Prisma, 则使用*.entity.ts文件定义 - 使用
class-validator和class-transformer对DTO进行校验 - 使用
@nestjs/schedule实现定时任务 - 使用
axios和@nestjs/axios发起HTTP请求 - 使用
@nestjs/throttler进行限流 (Rate Limiting),JAVA可使用高性能限流器Guava RateLimiter - 使用
helmet或@fastify/helmet配置更安全的Headers nestjs提供了 devtools, 可以可视化展示和调试- 使用
@nestjs/swagger展示API文档和在线调试 (OpenAPI)
文件后缀说明:
*.module.ts模块*.controller.ts控制器*.service.ts服务*.provider.ts提供者*.middleware.ts中间件*.decorator.ts装饰器*.guard.ts守卫*.pipe.ts管道*.interceptor.ts拦截器*.filter.ts异常过滤 (处理) 器*.dto.tsDTO,Data Transfer Object数据传输对象*.entity.tsEntity实体*.interface.ts接口*.spec.ts测试文件
接收参数
@Param
@Query
@Body
@Headers
ts
作用域
method scopedcontroller/resolver/gatewaycontroller scopedglobal scoped
控制器
controller
方法
全局
Use Decorators
Use 系列装饰器:
UseGuards及UseGlobalGuardsUsePipes及UseGlobalPipesUseInterceptors及useGlobalInterceptorsUseFilters及UseGlobalFilters
UseGuards
全局:
ts
// main.ts
app.useGlobalGuards(new RoleGuard(new Reflector()));
// app.useGlobalGuards(new RoleGuard(app.get(Reflector)));ts
// app.module.ts
@Module({
providers: [
{
provide: APP_GUARD,
useClass: RoleGuard,
},
],
})UsePipes
全局:
ts
// main.ts
app.useGlobalPipes(new CustomValidationPipe());ts
// app.module.ts
@Module({
providers: [
{
provide: APP_PIPE,
useClass: CustomValidationPipe,
},
],
})UseInterceptors
全局:
ts
// main.ts
app.useGlobalInterceptors(new LoggerInterceptor());ts
// app.module.ts
@Module({
providers: [
{
provide: APP_INTERCEPTOR,
useClass: LoggerInterceptor,
},
],
})UseFilters
全局:
ts
// main.ts
app.UseGlobalFilters(new HttpExceptionFilter());ts
// app.module.ts
@Module({
providers: [
{
provide: APP_FILTER,
useClass: HttpExceptionFilter,
},
],
})Header
controller 中设置响应头:
ts
@Get()
@Header('Content-Type', 'text/plain')
@Header('Content-Disposition', 'attachment; filename="README.md"')或者在路由内:
ts
// express 写法
// TODO fastify 写法
@Get()
download(@Res({ passthrough: true }) res: Response) {
res.set({
'Content-Type': 'text/plain',
'Content-Disposition': 'attachment; filename="README.md"',
})
}在服务内:
ts
// download.service.ts
import { StreamableFile } from '@nestjs/common';
return new StreamableFile(Buffer.from('# README'), {
type: 'text/plain',
disposition: 'attachment; filename=${README.md}',
}Redis
mac 安装 Redis:
bash
brew install redisbash
# 1
brew service start redis
# 2
# http://download.redis.io/redis-stable/redis.conf
redis-server /usr/local/etc/redis.confbash
mkdir /docker-data/redis
# docker run --name redis -p 6379:6379 -d redis --restart=always --requirepass "password"
docker run --name redis \
-p 6379:6379 \
-v /docker-data/redis/redis.conf:/etc/redis/redis.conf \
-v /docker-data/redis:/data \
-d redis redis-server /etc/redis/redis.conf --appendonly yes-p 6379 6379端口映射-v前者为宿主机, 后者为docker容器-d redis redis-server /etc/redis/redis.conf以容器内/etc/redis/redis.conf配置文件在后台启动docker--appendonly yes开启redis持久化--restart设置重启策略--requirepass设置密码