
effect-smol HTTP服务器实战从Hello World到生产就绪【免费下载链接】effect-smolCore libraries and experimental work for Effect v4项目地址: https://gitcode.com/GitHub_Trending/ef/effect-smoleffect-smol 是 Effect v4 的核心库仓库其内置的HttpApi模块让 Node.js HTTP 服务器开发变得简单而强大只需一份 Schema 优先的 API 定义就能同时获得类型安全的服务器、自动生成的 OpenAPI 文档和端到端类型检查的客户端。本文将从最简单的 Hello World HTTP 服务器讲起带你一步步走向生产就绪。为什么选择 HttpApi一份定义三处受益传统方式下路由定义、文档、客户端各自维护稍有改动就容易失步。HttpApi的核心理念是Schema 优先Schemas first构建块职责类比HttpApiEndpoint单条路由路径 方法 请求/响应 Schema一个接口HttpApiGroup一组相关端点一个模块HttpApi组合所有分组的顶层 API整个服务从这一定义出发你可以启动服务器实现并托管所有端点生成文档Scalar 或 Swagger 交互式页面自动生成派生客户端每个端点对应一个类型安全的方法改 Schema 后编译期即可发现不一致。完整设计说明见 HTTPAPI.md。快速上手三步写出 Hello World 服务器第一步定义 API。创建一个包含单个 GET 端点的 API声明成功响应为字符串const Api HttpApi.make(MyApi).add( HttpApiGroup.make(Greetings).add( HttpApiEndpoint.get(hello, /, { success: Schema.String }) ) )第二步实现处理器。用HttpApiBuilder.group把端点名hello绑定到一个返回Hello, World!的 Effectconst GroupLive HttpApiBuilder.group( Api, Greetings, (handlers) handlers.handle(hello, () Effect.succeed(Hello, World!)) )第三步启动服务器。把处理器、路由和 Node 平台层拼装起来指定端口后启动。平台层由 NodeHttpServer.ts 提供在 Bun 环境下可替换为BunHttpServerconst ApiLive HttpApiBuilder.layer(Api).pipe( Layer.provide(GroupLive), HttpRouter.serve, Layer.provide(NodeHttpServer.layer(createServer, { port: 3000 })) ) Layer.launch(ApiLive).pipe(NodeRuntime.runMain)运行后访问http://localhost:3000即可收到Hello, World!。一键生成 OpenAPI 文档生产级 API 离不开文档。HttpApi不需要你手写任何 OpenAPI 文件——只需提供一个文档层HttpApiScalar.layer(Api)在/docs路径提供Scalar交互式文档HttpApiSwagger.layer(Api)同样默认挂载在/docs使用Swagger UI。两者作用相同任选其一。文档内容参数、请求体、响应结构、状态码全部来自你的 API 定义通过OpenApi.annotations还可附加标题、描述等元信息如示例项目中的 API 根定义所示Api.ts。 文档、服务器、客户端共享同一份定义意味着它们永远不会互相矛盾。类型安全客户端像调用本地函数一样调用 API用HttpApiClient.make可以从 API 定义派生一个完全类型化的客户端每个端点变成一个方法const client yield* HttpApiClient.make(Api, { baseUrl: http://localhost:3000 }) const hello yield* client.Greetings.hello() // 完整类型推导无手动 HTTP 处理更妙的是客户端同样支持中间件可以统一注入 base URL、认证头甚至加上指数退避的重试策略。完整的服务端 客户端接线示例见官方教程 10_basics.ts。中间件与认证生产就绪的关键一环日志、鉴权等共享逻辑通过中间件实现。定义一个继承HttpApiMiddleware.Service的类再以 Layer 的形式实现然后挂到三个粒度的任意一个上端点级单个路由上调用.middleware(...)分组级整组路由共享例如给所有用户路由加鉴权API 级覆盖全部端点。项目中的示例非常典型Authorization中间件声明了bearer安全方案、可抛出的Unauthorized401错误并通过provides向下游处理器注入CurrentUser服务处理器只需读取该服务即可拿到当前用户。定义与实现分别见 Authorization.ts 和 server/Users/http.ts。另外中间件之间还可以互相依赖用requires/provides声明注意消费方必须声明在提供方之前的顺序规则详见 HTTPAPI.md 的Interdependent Middleware一节。错误处理与请求校验的默认行为HttpApi对错误有清晰约定场景默认行为Schema 校验失败如非法 query 参数返回空内容的400 Bad Request未声明错误 Schema处理器抛错返回500JSON自定义错误用Schema.TaggedErrorClass定义可直接在类上标注httpApiStatus想自定义 400 响应使用HttpApiMiddleware.layerSchemaErrorTransform创建拦截中间件把SchemaError转成你自己的错误类型。请求体的编码JSON、表单、纯文本、二进制、multipart 文件上传则通过HttpApiSchema.as*系列助手控制响应状态码用HttpApiSchema.status指定——所有配置都附着在 Schema 上集中且直观。生产部署技巧几个让服务更贴近生产的实用要点API 定义与实现分离把 API 定义放在独立包如fixtures/api/服务器与客户端共享避免服务器代码泄漏给客户端——这正是 10_basics.ts 开头注释强调的最佳实践。Serverless 友好HttpRouter.toWebHandler可以把整个路由转成标准 Web 处理函数直接用于云函数环境。平台可切换同一套代码配合NodeHttpServer、BunHttpServer等不同平台层运行客户端同理可选FetchHttpClient、NodeHttpClient、BunHttpClient。OpenAPI 导出通过openapiPath选项如/openapi.json导出标准 OpenAPI 描述方便对接其他工具链。总结effect-smol 中的HttpApi用一次定义、处处生效的方式把 HTTP 服务器开发中最易出错的部分——校验、文档、客户端同步、错误约定——全部自动化✅ 三步完成 Hello World 服务器✅ 零配置生成 Scalar / Swagger 文档✅ 编译期保障的端到端类型安全客户端✅ 灵活粒度的中间件与认证体系✅ 默认合理的错误处理与多种请求体编码。如果你是 Effect 生态的开发者建议从 HTTPAPI.md 完整文档和 51_http-server 教程 开始把 schema-first 的 HTTP 服务器实践应用到自己的项目中。【免费下载链接】effect-smolCore libraries and experimental work for Effect v4项目地址: https://gitcode.com/GitHub_Trending/ef/effect-smol创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考