主题
概述
NestJS 是一个用于构建高效、可扩展的服务器端应用程序的渐进式 Node.js 框架。它使用现代 JavaScript,完全支持 TypeScript,并结合了 OOP(面向对象编程)、FP(函数式编程)和 FRP(函数响应式编程)的元素。
为什么选择 NestJS?
- 企业级架构:模块化设计,易于维护和扩展
- TypeScript 原生:完整的类型支持,开发体验优秀
- 丰富的生态:与 Express/Fastify 无缝集成
- 内置最佳实践:依赖注入、装饰器、管道、守卫等
技术特性
| 特性 | 说明 |
|---|---|
| 编程语言 | TypeScript (100%) |
| 架构模式 | MVC / 模块化 / 依赖注入 |
| ORM 支持 | Prisma (推荐), TypeORM, Drizzle |
| 数据库 | PostgreSQL, MySQL, SQLite |
| 性能评分 | ★★★★☆ |
| 学习曲线 | 中等(需要理解装饰器和 DI) |
| API 文档 | Swagger / OpenAPI 自动生成 |
| 测试支持 | Jest 内置 |
生成的项目结构
ThesisAI 生成的 NestJS 项目遵循官方推荐的模块化结构:
backend
src
common // 公共模块
decorators // 自定义装饰器
filters // 异常过滤器
guards // 路由守卫
interceptors // 拦截器
pipes // 管道
config // 配置模块
configuration.ts // 环境配置
modules // 业务模块
auth // 认证模块(可选)
auth.module.ts
auth.service.ts
auth.controller.ts
strategies // Passport 策略
user // 用户模块
user.module.ts
user.service.ts
user.controller.ts
dto // 数据传输对象
[业务模块] // 根据需求生成
prisma // Prisma 相关
prisma.module.ts
prisma.service.ts
app.module.ts // 根模块
main.ts // 入口文件
prisma
schema.prisma // 数据库 Schema
seed.ts // 种子数据
test // 测试文件
.env.example // 环境变量示例
Dockerfile // Docker 配置
docker-compose.yml // Docker Compose
package.json
可用模块
NestJS 后端支持以下可选模块:
| 模块 | 说明 | 依赖 |
|---|---|---|
| Prisma Prisma | 类型安全的数据库 ORM | - |
| JWT 认证 | 基于 JSON Web Token 的认证 | Prisma |
| 文件上传 | 本地/S3 文件存储 | - |
开发环境
环境要求
| 依赖 | 版本要求 | 说明 |
|---|---|---|
| Node.js | >= 18.0 | 推荐 LTS 版本 |
| pnpm | >= 8.0 | 包管理器 |
| 数据库 | - | SQLite 无需安装,MySQL/PostgreSQL 需独立服务 |
安装依赖
bash
$
cd backend && pnpm install
环境变量
创建 .env 文件并配置以下变量:
| 变量名 | 说明 | 必填 |
|---|---|---|
| DATABASE_URL 默认值: file:./dev.db (SQLite) | 数据库连接字符串 | 是 |
| JWT_SECRET 默认值: your-secret-key | JWT 签名密钥 | 否 |
| JWT_EXPIRES_IN 默认值: 7d | JWT 过期时间 | 否 |
| PORT 默认值: 3000 | 服务端口 | 否 |
| CORS_ORIGIN 默认值: * | CORS 允许的源 | 否 |
数据库连接字符串示例
.env
bash
# SQLite(默认,无需额外服务)
DATABASE_URL="file:./dev.db"
# PostgreSQL
DATABASE_URL="postgresql://user:password@localhost:5432/mydb?schema=public"
# MySQL
DATABASE_URL="mysql://user:password@localhost:3306/mydb"数据库迁移
首次运行或 schema 变更后,执行迁移:
bash
$
pnpm prisma migrate dev --name init
启动开发服务器
bash
$
pnpm run start:dev
服务启动成功
- API 地址:
http://localhost:3000 - Swagger 文档:
http://localhost:3000/api - Prisma Studio: 执行
pnpm prisma studio打开数据库管理界面
代码示例
Controller 示例
user.controller.ts
typescript
import { Controller, Get, Post, Body, Param, UseGuards } from '@nestjs/common'
import { ApiTags, ApiOperation, ApiBearerAuth } from '@nestjs/swagger'
import { JwtAuthGuard } from '../auth/guards/jwt-auth.guard'
import { UserService } from './user.service'
import { CreateUserDto } from './dto/create-user.dto'
@ApiTags('用户管理')
@Controller('users')
export class UserController {
constructor(private readonly userService: UserService) {}
@Post()
@ApiOperation({ summary: '创建用户' })
create(@Body() createUserDto: CreateUserDto) {
return this.userService.create(createUserDto)
}
@Get(':id')
@UseGuards(JwtAuthGuard)
@ApiBearerAuth()
@ApiOperation({ summary: '获取用户详情' })
findOne(@Param('id') id: string) {
return this.userService.findOne(id)
}
}Service 示例
user.service.ts
typescript
import { Injectable, NotFoundException } from '@nestjs/common'
import { PrismaService } from '../prisma/prisma.service'
import { CreateUserDto } from './dto/create-user.dto'
@Injectable()
export class UserService {
constructor(private prisma: PrismaService) {}
async create(createUserDto: CreateUserDto) {
return this.prisma.user.create({
data: createUserDto,
})
}
async findOne(id: string) {
const user = await this.prisma.user.findUnique({
where: { id },
})
if (!user) {
throw new NotFoundException(`User #${id} not found`)
}
return user
}
}部署
Docker 部署
bash
$
docker build -t backend .
bash
$
docker run -p 3000:3000 --env-file .env backend
生产构建
bash
$
pnpm run build
bash
$
pnpm run start:prod
生产环境注意事项
- 确保
JWT_SECRET使用强随机字符串 - 配置合适的
CORS_ORIGIN - 使用 PostgreSQL 或 MySQL 替代 SQLite
- 启用 HTTPS
常见问题
Q: 如何添加新的业务模块?
使用 NestJS CLI 快速生成:
bash
$
npx nest g resource modules/product
Q: 如何处理跨域问题?
在 main.ts 中已配置 CORS,可通过 CORS_ORIGIN 环境变量控制允许的源。
Q: 如何自定义 Swagger 文档?
在 Controller 和 DTO 中使用 @Api* 装饰器添加描述。