其他
使用 Fastify + TypeScript 构建高性能…
适用于基于 Fastify、TypeScript、Prisma 和 Jest 开发 Node.js API 的场景。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 35/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 38/100 ×0.15
适用场景
使用 Fastify + TypeScr特定
解决思路
- 所有代码和文档使用英文。
- 为变量和函数(包括参数和返回值)始终声明类型。
- 避免使用 any 类型;需要时创建明确类型。
- 使用 JSDoc 记录公共类和方法。
- 编写简洁、可维护且技术准确的代码。
- 使用函数式和声明式编程模式;避免类。
- 优先使用迭代和模块化以遵循 DRY 原则。
- 类型和接口使用 PascalCase。
- 变量、函数和方法使用 camelCase。
- 文件和目录名使用 kebab-case。
- 环境变量使用 UPPERCASE。
- 使用带辅助动词的描述性变量名,如 isLoading、hasError、canDelete。
- 每个函数名以动词开头。
- 编写职责单一的短函数。
- 简单操作使用箭头函数。
- 整个代码库一致使用 async/await。
- 多个参数时使用 RO-RO 模式(Receive an Object, Return an Object)。
- 对象形状优先使用 interface 而非 type。
- 避免 enum;改用 map 或 const 对象。
- 使用 Zod 做运行时校验并推断类型。
- 不可变属性使用 readonly。
- 仅类型导入使用 import type。
- 按以下结构组织项目:src/routes/{resource}/index.ts、handlers.ts、schemas.ts;src/plugins/auth.ts、database.ts、cors.ts;src/services/{domain}Service.ts;src/repositories/{entity}Repository.ts;src/types/index.ts;src/utils/;src/config/;src/app.ts;src/server.ts。
- 按资源/领域组织路由。
- 使用路由插件进行模块化注册。
- 在路由处理程序旁定义 schemas。
- 使用路由前缀进行 API 版本管理。
- 按 FastifyPluginAsync 定义资源路由插件:注册 GET /、GET /:id、POST /、PUT /:id、DELETE /:id,并为每个路由传入 { schema: ...Schema } 与对应 handler,最后 export default usersRoutes。
- 为所有请求/响应校验定义 JSON schemas。
- 使用 @sinclair/typebox 定义类型安全 schema。
- 利用 Fastify 内置 Ajv 集成。
- 用 Type.Object 定义 schema,并用 Static<typeof UserSchema> 得到 TypeScript 类型;创建 createUserSchema,包含 body 和 response(201: UserSchema,400: ErrorSchema)。
- 使用插件实现共享功能。
- 用服务和工具装饰 Fastify 实例。
- 以正确的封装注册插件。
- 用 fastify-plugin 包装 databasePlugin:创建 PrismaClient,await prisma.$connect(),fastify.decorate('prisma', prisma),在 onClose 钩子中 await prisma.$disconnect(),并 export default databasePlugin。
- 使用 Prisma 作为数据库操作 ORM。
- 为数据访问创建 repository 类。
- 复杂操作使用事务。
- 在 UserRepository 构造函数注入 PrismaClient;findById 使用 prisma.user.findUnique({ where: { id } });create 使用 prisma.user.create({ data })。
- 使用 Fastify 内置错误处理。
- 为领域错误创建自定义错误类。
- 返回一致的错误响应。
- 定义 NotFoundError 实现 FastifyError,设置 code='NOT_FOUND'、statusCode=404;在 fastify.setErrorHandler 中按 error.statusCode || 500 返回 { error: error.name, message: error.message, statusCode }。
- 为服务和 handler 编写单元测试。
- 为路由使用集成测试。
- mock 外部依赖。
- 用 Jest 测试 Fastify:从 ../app 导入 build;beforeAll 中 app = await build();afterAll 中 await app.close();用 app.inject({ method: 'GET', url: '/api/users' }) 发起请求,断言 statusCode 为 200 且 payload 为 Array。
- 选择 Fastify 作为高性能 Node.js 框架。
- 使用 schema validation 进行自动序列化优化。
- 生产环境仅在需要时启用日志。
- 为数据库连接使用连接池。
- 使用 @fastify/helmet 设置安全头。
- 使用 @fastify/rate-limit 实现速率限制。
- 使用 @fastify/cors 配置 CORS。
- 使用 JSON Schema 校验所有输入。
- 使用 @fastify/jwt 进行 JWT 认证。
适用边界 · 注意事项
- 当项目不使用 Fastify、TypeScript、Prisma 或 Jest,而是使用其他框架/ORM/测试栈时,这些具体做法不适用。
- 当团队明确采用面向对象/类优先、enum 或非 JSON Schema 校验风格时,需调整或忽略对应规范。
- 当需要极简原型、无需类型安全、运行时校验、分层架构和测试时,不必全套采用。