关于 elysia
elysia 是面向 Elysia 框架开发的指导技能,涵盖按功能组织代码、类型化验证、错误处理、部署和测试模式。
主要功能
- 01按功能划分控制器与服务
- 02TypeBox 模式及推导的 TypeScript 类型
- 03集中式错误处理模式
- 04OpenAPI、身份验证与插件指引
- 05部署及 Vitest 测试实践
适用场景
- 01搭建类型化的 Elysia 功能模块
- 02添加验证和一致的错误响应
- 03配置 OpenAPI 与身份验证插件
- 04使用 Vitest 测试路由和服务
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ pedronauck/ skills --skill elysia安装后在 Claude Code 中输入/elysia确认已加载。
附带文件references/patterns.md
详细介绍
Elysia 开发指南
本技能为在此项目中使用 Elysia 框架提供指导原则、模式和最佳实践。
快速入门
有关详细的开发指南、导入和模式,请参阅此技能目录中的 references/patterns.md。
核心理念
- 建议采用不拘泥于模式、但以功能为基础的结构
- **“1 个 Elysia 实例 = 1 个控制器”**原则
- 使用 TypeBox 进行强类型运行时验证
- 集中处理错误并保持响应一致
- 适用于生产环境的部署策略
结构、路由与控制器
基本组织模式
- 将 App 作为控制器:将每个
new Elysia({ prefix })实例视为该功能的控制器。不要直接将整个类的方法作为处理程序传入,而应内联一个简短的处理程序来调用服务函数。 - 功能文件夹:采用以功能为基础的结构:
src/modules/<feature>/index.ts- Elysia 控制器(路由、守卫、Cookie)src/modules/<feature>/service.ts- 业务逻辑(不包含 HTTP 上下文)src/modules/<feature>/model.ts- 通过t(TypeBox)定义的架构和类型- 将共享实用工具放在
src/utils/*中。
- 方法链式调用:路由、守卫和插件优先使用 Elysia 实例的流式链式调用。
- 插件:通过
.use()将横切关注点封装为插件(例如 OpenAPI、JWT、CORS)。 - 上下文规范:如果服务需要请求数据,请将其保留在控制器中,并仅将相关字段传递给服务函数。
功能脚手架模式
创建功能脚手架时,生成以下内容:
model.ts,包含t.Object(...)架构,以及通过typeof schema.static导出的type别名。service.ts,包含纯函数(或在不需要实例状态时,包含一个仅有静态成员的abstract class)。index.ts,用于挂载 Elysia 路由、通过共享验证应用guard(),并返回带类型的响应。
验证、架构与类型
运行时验证 + 静态类型
- 使用
import { t } from 'elysia'定义 Body、Query、Params、Headers、Cookie 和 Response 架构。 - 从
typeof schema.static派生 TS 类型并导出(例如export type SignInBody = typeof signInBody.static)。 - 使用
.guard({ ... })应用共享验证。组合多个守卫时,可考虑使用schema: 'standalone'使其彼此独立。 - 根据内容验证文件:使用标准架构系统时,使用
fileType(魔数)。 - 确保为 2xx 响应和错误变体提供响应架构,以实现强端到端类型检查。
处理程序架构指南
生成处理程序时:
- 包含第 3 个参数架构对象,其中含有
body/query/params/headers/cookie/response。 - 对 GET/HEAD 请求不要解析正文(Elysia 遵循 HTTP 规范)。
- 提供使用
t.Object、t.Array、t.Union、t.Literal和文件架构的示例,并展示如何通过guard()共享 Query/Headers。
错误处理与响应结构
集中式错误管理
- 在 app 上使用
.onError(({ code, error, path, request }) => { ... }),将框架错误和自定义错误映射为统一的 JSON 结构(例如{ ok: false, error: { code, message, details } })。 - 错误控制流优先使用
throw status(code, messageOrPayload),以便onError捕获。注意:return status(...)不会被onError捕获。 - 验证错误:将其规范化为可预测的 JSON(问题数组),同时在生产环境中隐藏敏感内部信息。
- 包含关联 ID(例如
x-request-id),并在onError中记录日志。避免在生产环境中泄露堆栈跟踪。 - 成功响应可选择包装为
{ ok: true, data },以保持统一。
错误插件结构
生成代码时,创建:
src/plugins/error.ts,用于安装.onError(...)。- 可选的
src/plugins/logging.ts,用于在onResponse和onError中记录日志。
OpenAPI、身份验证与横切关注点
OpenAPI
- 添加
@elysiajs/openapi插件并公开文档路由(Scalar UI)。 - 确保 响应 架构准确——OpenAPI 会根据它们生成文档。
- 如果要构建 SDK,请确保路由具有完整类型定义并提供示例。
身份验证
- 使用
@elysiajs/jwt进行 JWT 签名和验证,或集成你选择的身份验证方案。 - 将身份验证放在一个插件中,在验证后用
user装饰上下文。 - 通过
.guard({ headers: t.Object({ authorization: t.String() }) })保护路由,并在处理程序运行前验证 bearer 令牌。
横切插件
- 在需要的地方安装
@elysiajs/cors。 - 可考虑使用
@elysiajs/server-timing和@elysiajs/opentelemetry进行可观测性监控。
生成脚手架时,请创建 src/plugins/openapi.ts、src/plugins/auth.ts,并在 src/app.ts 中接入它们。
部署、性能与 Docker
生产环境部署
- 多核场景使用 集群模式:使用一个小型启动器(
index.ts)派生工作进程,并让每个工作进程导入server.ts。 - 生产环境部署优先使用 Vite 或 esbuild 等打包工具进行构建。
- 如果编译会影响追踪(OpenTelemetry),请避免使用
--minify,或将已插桩的模块标记为--external。 - 接受
process.env.PORT(并设置回退值),且绑定到0.0.0.0,以适配 PaaS。
Docker
- 构建阶段:使用带有 pnpm 的 Node.js 基础镜像。
- 运行阶段:使用 distroless 基础镜像,复制二进制文件,并设置
CMD ["./server"]。
部署脚手架
生成部署脚手架时,请包含:
src/index.ts(集群启动器)、src/server.ts(应用)、Dockerfile(多阶段)和构建脚本。
测试
单元测试
- 使用
vitest。 - 导入应用,并使用
app.handle(new Request(url, options))断言状态码、正文和标头。 - 对于服务测试,直接调用纯函数。
要包含的测试示例
- 返回文本的简单 GET 测试。
- 带有
body验证的 POST 测试(包含有效和无效路径)。 - 使用模拟
Authorization标头的经过身份验证的路由示例。 - 每个路由和每个服务优先编写小型、聚焦的测试。
快捷工具
常见模式
- 应用上下文:使用
.state()和.decorate()添加版本信息、辅助函数等,然后从{ store, getDate }中读取。 - 简单的实时 API 可通过
.ws()创建 WebSocket 端点。 - 对特殊内容类型使用
.onParse()自定义正文解析器。
验证清单
完成涉及 Elysia 的任务前:
- 功能结构遵循
model.ts、service.ts、index.ts模式。 - 所有处理程序都有适当的架构定义(body/query/params/response)。
- 错误处理使用集中式
.onError()插件。 - 为 OpenAPI 生成定义响应架构。
- 测试使用
app.handle(new Request(...))模式。 - 运行类型检查(
pnpm run typecheck)和测试(pnpm run test)。
详细模式和代码示例请参阅 references/patterns.md。
评论
支持 Markdown