
effect-smol Schema中间件完全指南5个快速拦截编解码的高级技巧【免费下载链接】effect-smolCore libraries and experimental work for Effect v4项目地址: https://gitcode.com/GitHub_Trending/ef/effect-smoleffect-smol 是 Effect v4 的核心库仓库其 Schema 模块提供了强大的Schema中间件机制你可以在不修改原有校验逻辑的前提下拦截intercept解码和编码流水线实现失败兜底、动态注入服务、日志观测等高级能力。本文带你用 5 个实用技巧快速上手。为什么需要 Schema 中间件拦截编解码的本质普通校验只能通过或不通过而**中间件Middleware**包裹在编解码过程之外让你可以️拦截错误捕获解码失败Issue改成兜底值或换一种失败方式注入服务让兜底逻辑依赖外部服务如从配置中心读取默认值观测过程记录编解码失败日志不改业务代码Schema 中间件的 4 个核心 API 一览API作用方向适合场景Schema.middlewareDecoding解码拦截整个解码流水线可注入服务Schema.middlewareEncoding编码拦截整个编码流水线Schema.catchDecoding解码解码失败时返回兜底值最简单Schema.catchEncoding编码编码失败时返回兜底值 迁移提示v3 中的decodingFallback注解在 v4 已更名为catchDecoding见 migration/schema.md 与 migration/schema.md 的详细对比。官方文档的中间件章节位于 SCHEMA.md。技巧一用 middlewareDecoding 记录编解码失败日志最简单的入门场景是不改结果只看失败。middlewareDecoding会收到当前解码的Effect你可以用Effect.tapError在失败时打日志const Logged Schema.String.pipe( Schema.middlewareDecoding((effect) Effect.tapError(effect, (issue) Effect.log(decode failed, issue)) ) )它的完整类型签名位于 Schema.ts传入一个函数接收解码Effect和解析选项返回一个新的Effect——你可以自由地添加服务依赖、恢复错误或加工结果。技巧二用 catchDecoding 在解码失败时自动填充默认值解码失败兜底是中间件最常见用法。catchDecoding接收失败原因返回一个携带兜底值的Effect// 解码失败时返回 b而不是抛错 const schema Schema.String.pipe(Schema.catchDecoding(() Effect.succeedSome(b))) Schema.decodeUnknownExit(schema)(null) // Success(b)两个实用细节返回Option.some(值)表示兜底成功返回Option.none()表示把该字段从输出中省略非常适合可选字段。它本质上是middlewareDecoding的快捷方式实现见 Schema.ts。// 可选字段解码失败时直接省略该键 const schema Schema.Struct({ a: Schema.optionalKey(Schema.String).pipe(Schema.catchDecoding(() Effect.succeedNone)) }) Schema.decodeUnknownExit(schema)({ a: null }) // Success({})技巧三注入服务让兜底值动态可得当兜底值来自外部配置、数据库、远程服务时用catchDecodingWithContext声明服务依赖再用middlewareDecoding配合Effect.provideService注入class Service extends Context.ServiceService, { fallback: Effect.Effectstring }()(Service) {} const schema Schema.String.pipe( Schema.catchDecodingWithContext(() Effect.gen(function*() { const service yield* Service return Option.some(yield* service.fallback) }) ) ) // 解码时注入服务schema 对外部不再暴露依赖 const provided schema.pipe( Schema.middlewareDecoding(Effect.provideService(Service, { fallback: Effect.succeed(b) })) ) Schema.decodeUnknownExit(provided)(null) // Success(b)这套声明依赖 → 注入服务的组合拳让你在库代码里保持依赖声明在调用方决定兜底策略是 Effect 依赖注入风格在 Schema 编解码中的直接延伸。完整示例见 SCHEMA.md。技巧四编码方向的拦截middlewareEncoding 与 catchEncoding中间件同样覆盖编码把类型化值转回 JSON/FormData 等可序列化格式方向Schema.middlewareEncoding拦截编码流水线可记录编码失败、注入编码所需服务签名见 Schema.ts。Schema.catchEncoding编码失败时返回兜底值。例如先解码成number再编码为整数编码失败时兜底为0const schema Schema.Number.pipe( Schema.catchEncoding(() Effect.succeed(Option.some(0))), Schema.encodeTo(Schema.Int) )解码侧和编码侧的 API 完全对称你可以按需选择只拦截一个方向也可以两侧都加。技巧五redact——防止敏感信息泄漏的内置中间件库内置了一个典型的高级中间件Schema.redact。它在解码失败时把错误包装进Redacted阻止敏感的 schema 细节泄漏到错误消息中// 用 mapError 改写解码错误——这就是一个 middlewareDecoding export function redact(schema) { return middlewareDecoding(Effect.mapErrorEager(SchemaIssue.redact))(schema) }实现仅一行位于 Schema.ts。它示范了如何只用一个错误改写函数就构造出可复用的安全中间件。底层原理SchemaTransformation.Middleware 只包装方向函数所有中间件最终都会变成一个SchemaTransformation.Middleware实例——它只有decode和encode两个槽位分别存放对解码Effect和编码Effect的包装函数类定义见 SchemaTransformation.ts。两个设计要点值得新手理解中间件操作的是过程而非值它拿到的是整个编解码Effect因此可以叠加任意 Effect 组合子catch、tapError、provideService……表达能力远超单纯的值转换。支持flip()调用flip()可交换 decode/encode 两个方向方便把双向中间件翻转成单视角使用。middlewareDecoding实际上就是给 decode 槽位填你的函数、encode 槽位保持恒等的工厂方法。更多用法可参考官方测试中的断言示例 Schema.test.ts 与 Schema.test.ts。总结如何选择你的拦截方式你的需求推荐 API解码失败返回固定/静态默认值catchDecoding编码失败返回固定/静态默认值catchEncoding兜底逻辑依赖服务配置、远程数据catchDecodingWithContext/catchEncodingWithContextmiddlewareDecoding(Effect.provideService(...))记录日志、改写错误、观测整个流程middlewareDecoding/middlewareEncoding防止错误消息泄漏敏感信息Schema.redact内置中间件范例掌握这 5 个技巧你就完成了从声明式校验到可编程编解码流水线的跨越。更多 Schema 主题基础 schema、复合结构、转换、序列化、错误格式化可阅读 SCHEMA.md 的目录导览仓库整体结构介绍见 LLMS.md。【免费下载链接】effect-smolCore libraries and experimental work for Effect v4项目地址: https://gitcode.com/GitHub_Trending/ef/effect-smol创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考