关于 nestjs
为使用 NestJS 和 Drizzle ORM 构建服务端应用提供实践模式,面向 REST API、GraphQL 和微服务开发。指南覆盖 CRUD、JWT、数据库迁移、测试及相关集成。
主要功能
- 01NestJS 与 Drizzle ORM 配置
- 02CRUD 模块与分层结构
- 03JWT 与角色守卫
- 04数据库事务和迁移
- 05单元及集成测试
- 06微服务与 GraphQL 模式
适用场景
- 01构建 REST API 或 GraphQL 服务
- 02实现 JWT 身份验证和授权
- 03执行数据库操作与迁移
- 04开发 TCP 或 Redis 微服务
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ giuseppe-trisciuoglio/ developer-kit --skill nestjs安装后在 Claude Code 中输入/nestjs确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/best-practices.mddrizzle-reference.mdmigrations.mdpatterns.mdreference.mdtesting.mdworkflow-optimization.md详细介绍
NestJS 框架与 Drizzle ORM
概述
提供使用 Drizzle ORM 构建可用于生产环境的服务端应用的 NestJS 模式。涵盖 CRUD 模块、JWT 身份验证、数据库操作、迁移、测试、微服务和 GraphQL 集成。
适用场景
- 使用 NestJS 构建 REST API 或 GraphQL 服务端
- 使用 JWT 设置身份验证和授权
- 使用 Drizzle ORM 实现数据库操作
- 使用 TCP/Redis 传输创建微服务
- 编写单元测试和集成测试
- 使用 drizzle-kit 运行数据库迁移
说明
- 安装依赖:
npm i drizzle-orm pg && npm i -D drizzle-kit tsx - 定义架构:创建
src/db/schema.ts,定义 Drizzle 表 - 创建 DatabaseService:将 Drizzle 客户端注入为 NestJS 提供程序
- 构建 CRUD 模块:Controller → Service → Repository 模式
- 添加验证:使用 class-validator DTO 和 ValidationPipe
- 实现守卫:创建 JWT/Roles 守卫以保护路由
- 编写测试:使用
@nestjs/testing和模拟的 Repository - 运行迁移:
npx drizzle-kit generate→ 验证 SQL →npx drizzle-kit migrate
示例
使用 Drizzle 的完整 CRUD 模块
// src/db/schema.ts
export const users = pgTable('users', {
id: serial('id').primaryKey(),
name: text('name').notNull(),
email: text('email').notNull().unique(),
createdAt: timestamp('created_at').defaultNow(),
});
// src/users/dto/create-user.dto.ts
export class CreateUserDto {
@IsString() @IsNotEmpty() name: string;
@IsEmail() email: string;
}
// src/users/user.repository.ts
@Injectable()
export class UserRepository {
constructor(private db: DatabaseService) {}
async findAll() {
return this.db.database.select().from(users);
}
async create(data: typeof users.$inferInsert) {
return this.db.database.insert(users).values(data).returning();
}
}
// src/users/users.service.ts
@Injectable()
export class UsersService {
constructor(private repo: UserRepository) {}
async create(dto: CreateUserDto) {
return this.repo.create(dto);
}
}
// src/users/users.controller.ts
@Controller('users')
export class UsersController {
constructor(private service: UsersService) {}
@Post()
create(@Body() dto: CreateUserDto) {
return this.service.create(dto);
}
}
// src/users/users.module.ts
@Module({
controllers: [UsersController],
providers: [UsersService, UserRepository, DatabaseService],
exports: [UsersService],
})
export class UsersModule {}
JWT 身份验证守卫
@Injectable()
export class JwtAuthGuard implements CanActivate {
constructor(private jwtService: JwtService) {}
canActivate(context: ExecutionContext) {
const token = context.switchToHttp().getRequest()
.headers.authorization?.split(' ')[1];
if (!token) return false;
try {
const decoded = this.jwtService.verify(token);
context.switchToHttp().getRequest().user = decoded;
return true;
} catch {
return false;
}
}
}
数据库事务
async transferFunds(fromId: number, toId: number, amount: number) {
return this.db.database.transaction(async (tx) => {
await tx.update(accounts)
.set({ balance: sql`${accounts.balance} - ${amount}` })
.where(eq(accounts.id, fromId));
await tx.update(accounts)
.set({ balance: sql`${accounts.balance} + ${amount}` })
.where(eq(accounts.id, toId));
});
}
使用模拟对象进行单元测试
describe('UsersService', () => {
let service: UsersService;
let repo: jest.Mocked<UserRepository>;
beforeEach(async () => {
const module = await Test.createTestingModule({
providers: [
UsersService,
{ provide: UserRepository, useValue: { findAll: jest.fn(), create: jest.fn() } },
],
}).compile();
service = module.get(UsersService);
repo = module.get(UserRepository);
});
it('should create user', async () => {
const dto = { name: 'John', email: '[email protected]' };
repo.create.mockResolvedValue({ id: 1, ...dto, createdAt: new Date() });
expect(await service.create(dto)).toMatchObject(dto);
});
});
约束与警告
- 必须使用 DTO:始终使用 class-validator DTO,切勿接受原始对象
- 事务:保持事务简短;避免嵌套事务
- 守卫顺序:JWT 守卫必须先于 Roles 守卫运行
- 环境变量:切勿将 DATABASE_URL 或 JWT_SECRET 硬编码
- 迁移:更改架构后、部署前运行
drizzle-kit generate - 循环依赖:谨慎使用
forwardRef();优先调整模块结构
最佳实践
- 使用全局
ValidationPipe验证所有输入 - 对多表操作使用事务
- 使用 OpenAPI/Swagger 装饰器编写 API 文档
参考资料
以下资料提供高级模式和详细示例:
references/reference.md- 核心模式、守卫、拦截器、微服务和 GraphQLreferences/drizzle-reference.md- Drizzle ORM 的安装、配置和查询references/workflow-optimization.md- 开发工作流、并行执行策略
评论
支持 Markdown