尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
effect-smol HTTP服务器实战:从Hello World到生产就绪
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),仅供参考
RELATED

相关推荐

RapidOCR调优实操:3个参数让推理耗时减半

RapidOCR调优实操:3个参数让推理耗时减半

RapidOCR调优实操:3个参数让推理耗时减半 【免费下载链接】RapidOCR 📄 Awesome OCR multiple programing languages toolkits based on ONNX Runtime, OpenVINO, MNN, PaddlePaddle, TensorRT and PyTorch. 项目地址: https://gitcode.com/GitHub_Tre…

📅 2026/9/20 23:51:49
eza 颜色与主题定制完全指南:EZA_COLORS 环境变量与 theme.yml 详解

eza 颜色与主题定制完全指南:EZA_COLORS 环境变量与 theme.yml 详解

eza 颜色与主题定制完全指南:EZA_COLORS 环境变量与 theme.yml 详解 【免费下载链接】eza A modern alternative to ls 项目地址: https://gitcode.com/gh_mirrors/ez/eza eza(现代版 ls)在终端输出中对文件名、权限位、大小、日期、G…

📅 2026/9/20 23:51:49
Spring OAuth2 登录后跳不回 origin url?TaoToken 这样让 Codex 改对 LoginSuccessHandler

Spring OAuth2 登录后跳不回 origin url?TaoToken 这样让 Codex 改对 LoginSuccessHandler

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/9/20 23:51:49
MORE NEWS

更多资讯

📰

轻量级姿态-动作联合识别:热图编码+时序CNN闭环实现

简介:本资源是一份面向人工智能初学者与课程实践者的CNN应用实战项目,聚焦人体姿态与动作识别任务,适用于高校人工智能、计算机视觉相关课程大作业或课设开发。项目基于Python实现,包含数据采集、模型训练、姿态检测与动作测试四大…

📰

银行系统大文件上传加密方案:流式加密与分片上传实战

银行系统的JavaWeb项目里,一旦涉及大文件上传,就绕不开两个词:敏感数据和加密。客户身份证照片、银行卡影像、资产证明扫描件,动辄几十MB甚至几百MB,这些文件如果以明文形式落盘或者走网络传输,合规检查那一…

📰

ArcGIS Pro加载天地图WMTS:坐标系偏移与Key配置全解析

1. 天地图WMTS的坐标系门道:偏移问题到底从哪来先聊一个几乎所有ArcGIS Pro用户第一次接天地图都会撞上的问题:图层加进来了,影像也出来了,但叠加自己的矢量数据时,道路跑到了河对岸,建筑轮廓和张地图对不上…

📰

DeepSpeed 保存 Qwen3 共享张量报错?用 TaoToken 让 Codex 对照改 utils.py

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

Artificial Analysis 智能指数与价格:DeepSeek V4.1 Flash 跑批量任务值不值,TaoToken 在哪一步拿 Key

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

Grok 0.2.68 版本解析:MCP 服务器热更新、GROK_AGENT 环境变量与四项稳定性修复

Grok 0.2.68 版本解析:MCP 服务器热更新、GROK_AGENT 环境变量与四项稳定性修复 【免费下载链接】grok-build SpaceXAIs coding agent harness and TUI. Fullscreen, mouse interactive, extensible. 项目地址: https://gitcode.com/gh_mirrors/gr/grok-build …

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬