mcpField
N
nestjs

nestjs

github.com/giuseppe-trisciuoglio开发3654.2k 次安装7 周前更新
代码仓库

关于 nestjs

为使用 NestJS 和 Drizzle ORM 构建服务端应用提供实践模式,面向 REST API、GraphQL 和微服务开发。指南覆盖 CRUD、JWT、数据库迁移、测试及相关集成。

主要功能

  1. 01NestJS 与 Drizzle ORM 配置
  2. 02CRUD 模块与分层结构
  3. 03JWT 与角色守卫
  4. 04数据库事务和迁移
  5. 05单元及集成测试
  6. 06微服务与 GraphQL 模式

适用场景

  1. 01构建 REST API 或 GraphQL 服务
  2. 02实现 JWT 身份验证和授权
  3. 03执行数据库操作与迁移
  4. 04开发 TCP 或 Redis 微服务

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/giuseppe-trisciuoglio/developer-kit --skill nestjs

安装后在 Claude Code 中输入/nestjs确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
best-practices.md
drizzle-reference.md
migrations.md
patterns.md
reference.md
testing.md
workflow-optimization.md

详细介绍

NestJS 框架与 Drizzle ORM

概述

提供使用 Drizzle ORM 构建可用于生产环境的服务端应用的 NestJS 模式。涵盖 CRUD 模块、JWT 身份验证、数据库操作、迁移、测试、微服务和 GraphQL 集成。

适用场景

  • 使用 NestJS 构建 REST API 或 GraphQL 服务端
  • 使用 JWT 设置身份验证和授权
  • 使用 Drizzle ORM 实现数据库操作
  • 使用 TCP/Redis 传输创建微服务
  • 编写单元测试和集成测试
  • 使用 drizzle-kit 运行数据库迁移

说明

  1. 安装依赖:npm i drizzle-orm pg && npm i -D drizzle-kit tsx
  2. 定义架构:创建 src/db/schema.ts,定义 Drizzle 表
  3. 创建 DatabaseService:将 Drizzle 客户端注入为 NestJS 提供程序
  4. 构建 CRUD 模块:Controller → Service → Repository 模式
  5. 添加验证:使用 class-validator DTO 和 ValidationPipe
  6. 实现守卫:创建 JWT/Roles 守卫以保护路由
  7. 编写测试:使用 @nestjs/testing 和模拟的 Repository
  8. 运行迁移: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 - 核心模式、守卫、拦截器、微服务和 GraphQL
  • references/drizzle-reference.md - Drizzle ORM 的安装、配置和查询
  • references/workflow-optimization.md - 开发工作流、并行执行策略

评论

支持 Markdown