nestjs学习, PM2进程守护,https证书配置

NestJS 常用知识手册(从创建到部署)

本文档以 Markdown 格式整理,覆盖 NestJS 项目从初始创建、核心概念、常用功能实现,到生产构建、容器化与部署的常见流程与示例。


1、https证书配置看这个nestjs服务器部署https证书配置------点击跳转

2、

  1. 前提与环境准备

  2. 创建项目与常用命令

  3. 项目结构说明

  4. 核心概念(模块、控制器、提供者、依赖注入)

  5. 请求处理与验证(Pipes / DTO / Validation)

  6. 中间件、守卫、拦截器、异常过滤器

  7. 配置管理与环境变量(@nestjs/config)

  8. 数据库(TypeORM / Prisma / Mysql)示例

  9. 认证(Passport + JWT)与授权

  10. 文件上传、静态资源、WebSocket、微服务简介

  11. 缓存(Redis)、队列(Bull / BullMQ)

  12. 测试(单元测试 / e2e)

  13. 安全与性能建议

  14. 生产构建与运行

  15. Docker 化与 docker-compose 示例

  16. 部署方案示例(VPS + Nginx / PM2 / Kubernetes / CI)


前提与环境准备

  • 推荐 Node 版本:Node 22+(LTS)
  • 包管理器:npm / yarn / pnpm(任选)。
  • 全局安装 Nest CLI(可选,但推荐):
bash 复制代码
npm i -g @nestjs/cli
# or
pnpm add -g @nestjs/cli
  • 推荐工具:Git、Docker(生产/容器化)、数据库客户端(psql / pgAdmin / MongoDB Compass)、Redis

创建项目与常用命令

使用 Nest CLI 创建

csharp 复制代码
nest new my-nest-app
# 选择包管理器(npm/yarn/pnpm)

常用 NPM 脚本(package.json

  • npm run start:dev - 开发热重载
  • npm run start - 运行(默认)- npm run build - TypeScript 编译到 dist/
  • npm run start:prod - 生产模式(通常 node dist/main.js

Nest CLI 常用命令

bash 复制代码
nest generate module users
nest g controller users --no-spec
nest g service users --no-spec

项目结构说明

典型结构:

java 复制代码
src/
  app.module.ts
  main.ts
  users/
    users.module.ts      //声明注入
    users.controller.ts //控制
    users.service.ts  //逻辑
    dto/      //dto管道
    entities/  //users.entity.ts 数据表的声明文件 

test/
package.json
tsconfig.json
.env
  • main.ts:程序入口(创建 Nest 应用、注册中间件、全局管道/拦截器)
  • app.module.ts:根模块,负责整合其他模块
  • 每个功能模块(feature module)包含 controller / service / module

核心概念

Module(模块)

  • 模块用于组织代码边界,通常按照功能或域划分。

Controller(控制器)

  • 处理路由与请求,负责接收请求、调用服务并返回响应。

示例 Controller:

typescript 复制代码
import { Controller, Get } from '@nestjs/common';
import { UsersService } from './users.service';

@Controller('users')
export class UsersController {
  constructor(private readonly usersService: UsersService) {}

  @Get()
  findAll() {
    return this.usersService.findAll();
  }
}

Provider / Service(提供者/服务)

  • 包含业务逻辑,通常由控制器注入并使用。

依赖注入(DI)

  • Nest 使用基于元数据的 DI,服务通过构造函数注入。

请求处理与验证(Pipes / DTO / Validation)

DTO + class-validator

typescript 复制代码
// create-user.dto.ts
import { IsString, IsEmail } from 'class-validator';

export class CreateUserDto {
  @IsEmail()
  email: string;

  @IsString()
  password: string;
}

main.ts 中启用全局验证管道:

javascript 复制代码
import { ValidationPipe } from '@nestjs/common';

app.useGlobalPipes(new ValidationPipe({
  whitelist: true, // 自动删除 DTO 中未声明的字段
  forbidNonWhitelisted: true, // 拒绝多余字段
  transform: true, // 自动类型转换
}));

中间件、守卫、拦截器、异常过滤器

  • Middleware:在路由处理前执行(类似 Express middleware)。
  • Guard:用于权限检查(例如 JWT 校验)。
  • Interceptor:用于响应包装、日志、性能监控、缓存等。
  • Exception Filter:定制错误响应格式。

示例:全局 ValidationPipeCacheInterceptor,以及 UseGuards(AuthGuard('jwt'))


配置管理与环境变量

推荐使用 @nestjs/config

css 复制代码
npm i @nestjs/config

app.module.ts 中:

kotlin 复制代码
import { ConfigModule } from '@nestjs/config';

@Module({
  imports: [ConfigModule.forRoot({ isGlobal: true })],
})
export class AppModule {}

使用 process.env 或注入 ConfigService

kotlin 复制代码
constructor(private configService: ConfigService) {
  const port = this.configService.get<number>('PORT');
}

.env 示例:

ini 复制代码
NODE_ENV=development
PORT=3000
DATABASE_URL=postgres://user:pass@localhost:5432/dbname
JWT_SECRET=your_jwt_secret

数据库示例

TypeORM(Postgres)

安装:

css 复制代码
npm i @nestjs/typeorm typeorm pg

AppModule 中注册:

php 复制代码
TypeOrmModule.forRoot({
  type: 'postgres',
  url: process.env.DATABASE_URL,
  entities: [__dirname + '/**/*.entity{.ts,.js}'],
  synchronize: false, // 生产不要使用 true
})

使用实体(Entity) + Repository 注入。

Prisma(ORM)

步骤概览:

css 复制代码
npm i prisma --save-dev
npm i @prisma/client
npx prisma init
# 编辑 schema.prisma,配置数据源
npx prisma migrate dev --name init

在 Nest 中封装 PrismaService(继承 PrismaClient)以便注入使用。

Mongoose(MongoDB)

css 复制代码
npm i @nestjs/mongoose mongoose

使用 MongooseModule.forRoot() 注册并创建 schema/model。


认证与授权(Passport + JWT)

推荐使用 @nestjs/passport + passport-jwt

bash 复制代码
npm i @nestjs/passport passport passport-jwt
npm i @types/passport-jwt -D

主要步骤:

  1. 实现 JwtStrategy(继承 PassportStrategy
  2. 使用 AuthGuard('jwt') 保护路由
  3. 登录时签发 access tokenjsonwebtoken@nestjs/jwt

示例:

perl 复制代码
// 签发 token
import { JwtService } from '@nestjs/jwt';
const token = this.jwtService.sign({ sub: user.id });

刷新 token、黑名单(登出)等可根据业务扩展。


文件上传、静态资源、WebSocket、微服务简介

  • 文件上传:使用 @UseInterceptors(FileInterceptor('file')) + multer
  • 静态资源:app.useStaticAssets(join(__dirname, '..', 'public'))
  • WebSocket:@WebSocketGateway() + @SubscribeMessage()
  • 微服务:Nest 提供 Transport.TCPRedisNATSKafka 等客户端/服务器模式。

缓存(Redis)与队列(Bull)

  • 缓存:CacheModule.register(),结合 cache-managerredis
  • 队列:使用 @nestjs/bull(或 bullmq),常用于邮件发送、图像处理、耗时任务。

测试(单元 / e2e)

  • 单元测试:使用 Jest,mock 服务和 repository。
  • e2e 测试:使用 SuperTest 启动 app.getHttpServer() 进行接口测试。

示例 e2e:

javascript 复制代码
import * as request from 'supertest';
import { INestApplication } from '@nestjs/common';

it('/ (GET)', () => {
  return request(app.getHttpServer()).get('/').expect(200);
});

安全与性能建议

  • 开启 helmet:app.use(helmet())
  • 开启压缩:app.use(compression())
  • 限流:@nestjs/throttler 或自定义限流中间件。
  • 输入校验与 DTO 白名单(whitelist: true)。
  • 不在生产使用 synchronize: true(TypeORM)。
  • 使用 HTTPS / TLS(Nginx 反向代理或 Ingress)。
  • 敏感配置放在环境变量或 Secrets 管理器中。

PM2进程守护,生产构建与运行

  • 构建:
css 复制代码
pnpm build
# 使用 pm2
pm i -g pm2
pm run build
pm2 start dist/main.js --name my-nest-app
  • 可用 nest start --watch 在开发中实时重载。

Docker 化与 docker-compose 示例

推荐的多阶段 Dockerfile

docker-compose.yml

yaml 复制代码
services:
  db:
    image: mysql:8.0
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: yjst
    ports:
      - 3306:3306
    volumes:
      - mysql_data:/var/lib/mysql

  adminer:
    image: adminer
    restart: always
    ports:
      - 8080:8080

volumes:
  mysql_data:

docker-compose 示例(包含 Postgres + Redis)

yaml 复制代码
version: '3.8'
services:
  app:
    build: .
    ports:
      - '3000:3000'
    environment:
      - DATABASE_URL=postgres://postgres:password@db:5432/app
      - REDIS_HOST=redis
    depends_on:
      - db
      - redis
  db:
    image: postgres:15
    environment:
      POSTGRES_DB: app
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: password
    volumes:
      - pgdata:/var/lib/postgresql/data
  redis:
    image: redis:7
    volumes:
      - redisdata:/data

volumes:
  pgdata:
  redisdata:

部署方案示例

1)PM2 + ssl证书

  • 步骤概览:

    1. 在服务器上安装 Node、PM2、Nginx。
    2. git pull 或 docker pull、构建镜像并运行。
    3. 使用 Nginx 代理 http://127.0.0.1:3000 并做 TLS(Let's Encrypt)。
    4. 使用 PM2 管理应用进程或直接用 Docker 运行容器。

Nginx 示例(简化):

ini 复制代码
server {
  listen 80;
  server_name api.example.com;

  location / {
    proxy_pass http://127.0.0.1:3000;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
  }
}

使用 Certbot 获取 TLS 证书并启用 HTTPS。

2) Docker / Docker Compose

  • 在服务器上安装 Docker 与 docker-compose,执行 docker-compose up -d --build

常见问题与排查

  • 环境变量未生效 :生产环境可能没有读取 .env,请使用 ConfigModule.forRoot({ isGlobal: true, envFilePath: '.env' }),或通过外部方式(systemd/PM2/Kubernetes Secret)注入。
  • CORS 报错 :启用 app.enableCors() 或在 Nginx 层配置。
  • TypeORM 同步在生产导致数据丢失/结构改变 :生产请使用迁移(migrations)而非 synchronize: true
  • 端口被占用:确认服务器上没有重复的服务监听同一端口。
  • 日志太少/不易分析 :引入 winston 或云日志方案(Stackdriver/CloudWatch)并配置结构化日志。

最佳实践清单(快速)

  • 使用 DTO + ValidationPipe(whitelist: true
  • 将敏感配置放到环境变量或 Secret 管理器
  • 生产使用 Docker 或 process manager(PM2/systemd)运行
  • 使用 HTTPS,并在反向代理层处理证书
  • 对数据库使用迁移工具管理 schema 变更
  • 在 CI 中运行测试,构建并推送镜像

参考与扩展阅读(关键词提示)

  • NestJS 官方文档(Modules / Providers / Controllers / Microservices)
  • @nestjs/config
  • class-validator / class-transformer
  • TypeORM / Prisma / Mongoose
  • @nestjs/passport / passport-jwt
  • @nestjs/bull / bullmq
  • Docker / Kubernetes / PM2 / Nginx

如果你需要:

  • 我可以把此文档导出为 可下载的 Markdown 文件 (.md)PDF
  • 也可以把其中的 Dockerfile、docker-compose、Kubernetes YAML、GitHub Actions 等代码块拆成单独文件并打包成 zip;
  • 或者根据你的项目需求(例如使用 Prisma + Postgres + Redis)把文档里的示例做成一个可运行的模板仓库。

nestjs生命周期

相关推荐
看晴天了2 小时前
Tailwind的安装,配置,使用步骤
前端
blues_C2 小时前
Playwright MCP vs Chrome DevTools MCP vs Chrome MCP 深度对比
前端·人工智能·chrome·ai·chrome devtools·mcp·ai web自动化测试
木心操作3 小时前
nodejs动态创建sql server表
前端·javascript·sql
一个很帅的帅哥3 小时前
Vue中的data为什么是函数?
前端·javascript·vue.js·data
南屿im3 小时前
用 Node.js 开发命令行工具:打造你的高效 CLI
前端·javascript
ObjectX前端实验室4 小时前
【react18原理探究实践】render阶段【首次挂载】
前端·react.js
ObjectX前端实验室4 小时前
【react18原理探究实践】组件的 props 和 state 究竟是如何确定和存储的?
前端·react.js
fxshy5 小时前
解决 Web 应用加载地图资源时的 HTTP 与 HTTPS 混合内容问题
前端·网络协议·http
一个很帅的帅哥5 小时前
Vue keep-alive
前端·javascript·vue.js·keep-alive