NestJS 常用知识手册(从创建到部署)
本文档以 Markdown 格式整理,覆盖 NestJS 项目从初始创建、核心概念、常用功能实现,到生产构建、容器化与部署的常见流程与示例。
1、https证书配置看这个nestjs服务器部署https证书配置------点击跳转
2、
-
前提与环境准备
-
创建项目与常用命令
-
项目结构说明
-
核心概念(模块、控制器、提供者、依赖注入)
-
请求处理与验证(Pipes / DTO / Validation)
-
中间件、守卫、拦截器、异常过滤器
-
配置管理与环境变量(@nestjs/config)
-
数据库(TypeORM / Prisma / Mysql)示例
-
认证(Passport + JWT)与授权
-
文件上传、静态资源、WebSocket、微服务简介
-
缓存(Redis)、队列(Bull / BullMQ)
-
测试(单元测试 / e2e)
-
安全与性能建议
-
生产构建与运行
-
Docker 化与 docker-compose 示例
-
部署方案示例(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:定制错误响应格式。
示例:全局 ValidationPipe
、CacheInterceptor
,以及 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
主要步骤:
- 实现
JwtStrategy
(继承PassportStrategy
) - 使用
AuthGuard('jwt')
保护路由 - 登录时签发
access token
(jsonwebtoken
或@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.TCP
、Redis
、NATS
、Kafka
等客户端/服务器模式。
缓存(Redis)与队列(Bull)
- 缓存:
CacheModule.register()
,结合cache-manager
与redis
。 - 队列:使用
@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证书
-
步骤概览:
- 在服务器上安装 Node、PM2、Nginx。
git pull
或 docker pull、构建镜像并运行。- 使用 Nginx 代理
http://127.0.0.1:3000
并做 TLS(Let's Encrypt)。 - 使用 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生命周期

