zhangdizhangdi

后端 - NestJS

文档

开始

bash
$ npm i -g @nestjs/cli
$ nest new ${project-name}

环境变量

bash
# 安装
$ npm i @nestjs/config
  1. 新建 .env.xx 文件
  2. 开发环境
    pacakge.json 相应的 script 添加 NODE_ENV=xxx
json
"scripts": {
  "dev": "NODE_ENV=development nest start --watch",
  "build": "nest build",
  "start": "node dist/src/main",
}
  1. 测试和线上环境
bash
# .env.test 文件
NODE_ENV=test

# docker-compose.yml 文件
env_file:
  - .env.test

项目中使用

ts
// 加载
import { ConfigModule } from '@nestjs/config';

ConfigModule.forRoot({
  isGlobal: true,
  envFilePath: [`.env.${process.env.NODE_ENV}`],
}),

可以不用 ConfigServiceprocess.env 可以拿到值

数据库

bash
# 安装
$ npm i @nestjs/typeorm typeorm mysql2

Migrations

命令

  • create:生成文件,但没有指令,自己写
  • generate:自动生成指令
json
// package.json script
"typeorm": "typeorm-ts-node-commonjs -d ormconfig.ts",
"migration:generate": "npm run typeorm migration:generate src/migrations/migration",
"migration:run": "npm run typeorm migration:run",

dev环境执行 migration:generate, ormconfig.ts 拿不到环境变量的时候,去读文件。

ts
import { config } from 'dotenv'

let env = process.env
if (!env.NODE_ENV) {
  const params = config({
    path: `.env.dev`,
  })
  env = params.parsed
}

时区

服务器和数据库都使用的UTC时间

后面购买的腾讯云数据库,它的时区默认 +08:00
可以在:数据库管理->参数设置->time_zone改为+00:00

为什么后来没使用docker部署mysql,而购买?
因为服务器配置不高,部署很容易卡死,限制太低查询又很慢。

API 文档

分成 admin-docspublic-docs 两端文档

deepScanRoutes: true 需要设置

其他可以使用 swagger 生成的 json 文件:

功能相关

验证

bash
# 1. 都要安装
$ npm i class-validator class-transformer
# 2. main.ts 要添加
app.useGlobalPipes(new ValidationPipe())

Response字段

adminpublic 返回不同字段

ts
// 1. main.ts
app.useGlobalInterceptors(new ClassSerializerInterceptor(app.get(Reflector)))

// 2. entity.ts
@Expose({ groups: ['client:admin'] })
@CreateDateColumn()
create_at: Date;

// 3. controller.ts
@SerializeOptions({ groups: ['client:admin'] })
export class ActorAdminController {}

跨域

部署

  1. 使用 Docker和Docker Compose
  2. 使用三级域名,配置nginx.conf反向代理
  3. 部署 - GitHub Actions
    • GitHub这边构建
    • rsync文件同步到服务器
    • ssh登录执行docker相关操作
yml
# -d:后台运行
docker-compose -f docker-compose.test.yml --env-file .env.test --compatibility up -d --build test-api
docker exec -d test-api npm run migration:run
docker image prune -f