Tea 中间件机制深度解析如何快速为仓颉 Web 框架打造请求拦截链【免费下载链接】tea仓颉语言轻量级的、函数式的、高效的HTTP Web后端框架项目地址: https://gitcode.com/Cangjie-SIG/teaTea是一个用仓颉Cangjie语言编写的轻量级、函数式、高效的 HTTP Web 后端框架。它的中间件Middleware机制让请求拦截链变得极其简单——你只需几行代码就能在任意路由前插入鉴权、日志、CORS、限流等逻辑而完全不必污染业务 Handler。本文带你从原理到实战一次看懂并亲手打造属于自己的请求拦截链。核心关键词Tea 中间件、仓颉 Web 框架请求拦截链、use 注册中间件、CORS 中间件、共享参数 set/get、钩子函数 Hooks一、什么是 Tea 中间件先看懂洋葱模型 中间件的本质是一层包裹在请求与响应外围的处理函数。一个请求进来后会依次剥开多个中间件当它最终到达业务 Handler 后又逐层回包——这就是经典的洋葱模型Onion Model。在 Tea 里中间件和 Handler 是同一种东西public type HandlerFunc (TeaContext) - Unit // 接收上下文返回 Unit public open class Handler { ... } // 仿函数可携带元信息 metaData每个中间件接收一个TeaContext下文简称c代表当前请求的完整上下文。调用c.next()→ 放行进入下一个中间件 / Handler。不调用c.next()→ 拦截链在此中断请求不会继续往下走。 一句话记忆next()是油门不调就是刹车。这是所有拦截能力鉴权拒绝、限流、错误兜底的来源。中间件的入口定义在 src/core.cjHandler作为仿函数还能携带metaData一个HashMap方便你给每个处理函数打标签。二、如何注册中间件use 方法的 3 种写法Tea 用use方法注册中间件实现在 src/tea.cj。按作用范围它有 3 种常见用法写法作用范围典型场景app.use { ... }全部路由、全部方法全局日志、统一 CORSapp.use(/api, { ... })仅匹配路径前缀/api接口鉴权group.use { ... }仅路由组内部版本分组/v1、/v2独立策略1. 全局中间件最简单let app Tea.default() // 为 app 下全部路由注册任意请求都会先经过它 app.use { c println( 收到请求 ${c.getMethod()}) c.next() // 必须调用否则会中断 }2. 按路径前缀注册// 只有 /admin 开头的路由才走这段中间件 app.use(/admin) { c // 校验管理员身份失败则不调用 c.next() 即可拦截 c.next() }3. 路由组Group中间件通过 src/group.cj 的use给整个版本组挂一套独立策略是组织多版本 API 的最佳实践let v1 app.group(/api/v1) { c c.set(version, v1) // 给整组打标签 c.next() } v1.get(/list) { c /* ... */ }✅ 小提示use注册的是通配方法路由意味着它对 GET/POST/PUT 等所有 HTTP 方法都生效无需为每个方法单独注册。三、请求拦截链是如何执行的next() 逐层拆解 很多人只记住了c.next()却不知道它背后是两级推进。我们把执行引擎拆开看你就彻底懂了。第一级TeaContext.next()中间件内部推进源码见 src/context.cjpublic func next(): Unit { this.indexHandler // 指针 1 if (this.indexHandler this.route.handlers.size) { this.route.handlersthis.indexHandler // 执行“下一个” return } this.app.next(this) // 本路由用完 → 交给 Tea }当前路由上挂着一串handlers中间件 主 Handler 排成一队。每调一次next()indexHandler前进一格执行队列中的下一个函数。第二级Tea.next()路由之间推进当一个路由的 handlers 全部用完会调用 src/tea.cj 的next()func next(ctx: TeaContext): Unit { // 1. 按 method 前缀树取出候选路由列表 // 2. 逐个尝试 matchPath 匹配 // 3. 命中后ctx.indexHandler 0执行 handlers[0] // 4. 都没命中抛出 404 }为什么中间件一定在 Handler 之前答案在注册逻辑 src/tea.cjlet handlers ArrayListHandler() if (middleware.size 0) { handlers.add(all: middleware) // ① 先放中间件 } if (handler.isSome()) { handlers.add(handler.getOrThrow()) // ② 再放主 Handler }中间件永远排在主 Handler 前面——这正是拦截二字的由来它们先于业务逻辑执行也先有机会截停请求。四、在中间件之间传递数据set 与 get 共享参数 同一条拦截链上的所有函数共享同一个TeaContext。想把上游算出来的东西交给下游用set/get即可实现在 src/context.cj底层是一个ConcurrentHashMap。app.use { c c.set(userId, u-10086) // 上游写入共享参数 c.next() } app.get(/test) { c let uid c.get(userId) // 下游读取 c.sendString(hello ${uid}) // hello u-10086 }典型用途认证中间件把登录用户信息set进上下文后续所有 Handler 直接get取用避免重复解析 Token。 注意set的 value 是Any类型取出后通常需要as转型如book as String。五、实战用内置 CORS 中间件拦截跨域请求 ️Tea 自带一个非常完整的CORS 跨域中间件位于 src/middleware/cors/cors.cj。它是中间件能力的最佳样板——一个函数搞定预检请求OPTIONS、来源白名单、凭证控制。它拦截了什么读取请求头Origin比对白名单allowOrigins支持*与://*.通配子域。遇到OPTIONS预检 → 直接返回204 No Content不调用c.next()把跨域请求就地拦截。普通请求 → 写入Access-Control-Allow-*系列响应头后c.next()放行。核心拦截片段src/middleware/cors/cors.cj// OPTIONS 预检且无方法头 → 直接放行给后续 if (c.getMethod() MethodOptions c.getRequestHeader(HeaderAccessControlRequestMethod) ) { c.vary(HeaderOrigin) return c.next() } // ... 校验来源、设置响应头 ... return c.sendStatus(StatusNoContent) // 拦截不进入业务怎么用只需 3 行import tea.middleware.cors.cors let app Tea.default() app.use(cors(CorsConfig(allowOrigins: [https://example.com]))) app.get(/) { c c.sendString(ok) } app.run(8080)✅ 这让你零成本获得生产级跨域拦截——来源校验、预检响应、Credentials互斥校验*与凭证不可并存会直接抛错全部内置。六、进阶中间件 vs 钩子函数 Hooks 的区别 ⚙️Tea 除了请求期的中间件还提供 6 类生命周期钩子Hooks定义在 src/hooks.cj。它们的作用时机完全不同维度中间件use / next钩子函数Hooks触发时机每个 HTTP 请求框架生命周期节点典型用途鉴权、日志、CORS、限流路由/分组注册监听、启动、关闭能否拦截请求✅ 能不调 next 即拦截❌ 否只做旁路通知6 类钩子一览OnRoute/OnName—— 添加 / 命名路由之后OnGroup/OnGroupName—— 添加 / 命名分组之后OnListen—— 启动监听之前OnShutdown—— 调用shutDown()时app.hooks.registerOnListen { println(即将启动可在此做预热 / 校验) } 选型口诀要拦截请求 → 用中间件要监听框架事件 → 用 Hooks。七、错误兜底中间件抛异常怎么办拦截链中任何函数抛出异常都不会让服务崩掉——Tea 在请求入口处统一捕获并交给错误处理器src/tea.cj、src/tea.cjtry { next(ctx) } catch (e: Exception) { // 有错误没被处理 → 调用 errorHandler if (!ctx.app.handlerError(ctx, e)) { throw e // 处理器返回 false 才继续抛 } }默认defaultErrorHandler会读取Error中的状态码回写5xx响应体并返回true表示已兜底。你可通过TeaConfig.errorHandler自定义比如统一返回 JSON 错误结构、打日志、埋点。 配合中间件你可以在最外层写一个异常日志中间件再交给errorHandler统一格式化响应形成记录 → 兜底的完整闭环。八、快速上手清单5 步打造拦截链✅构造应用let app Tea.default()src/tea.cj。挂全局中间件app.use { c ... ; c.next() }做统一日志。按前缀加固app.use(/admin) { ... }做鉴权拦截。组内共享用c.set / c.get在拦截链中传递用户态。接入 CORSapp.use(cors(CorsConfig(...)))一键跨域。 更多 API 细节路由参数、配置项、常量可查阅 README.md完整示例见 src/test/tea_test.cj 与 src/test/cors_test.cj架构设计说明见 doc/design.md。写在最后Tea 的中间件机制把洋葱模型做得极其克制一个next()贯穿两级推进一个set/get完成数据流转一个use覆盖全局 / 前缀 / 分组三种作用域。理解这三点后你就能为仓颉 Web 框架搭建出既灵活又安全、层层可控的请求拦截链。【免费下载链接】tea仓颉语言轻量级的、函数式的、高效的HTTP Web后端框架项目地址: https://gitcode.com/Cangjie-SIG/tea创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
Flet StrokeCap 详解:掌控 Canvas 线条端点的绘制风格 前端跨平台桌面应用移动开发 【免费下载链接】flet Build realtime web, mobile and desktop apps in Python only. No frontend experience required. 项目地址: https://gitcode.com/gh_mirrors/fl/flet 点击查看 免费下载 导读
StrokeCap 是 Flet 中用于定义描… · 2026/9/24 14:26:40
PaddleNLP BigBird 建模模块深度解析:块稀疏注意力架构与全部任务头源码指南 人工智能大模型预训练微调LoRARLHF强化学习分布式训练 【免费下载链接】PaddleNLP Easy-to-use and powerful LLM and SLM library with awesome model zoo. 项目地址: https://gitcode.com/gh_mirrors/pa/PaddleNLP 点击查看 免费下载 BigBird 是一类基于块稀疏注… · 2026/9/24 14:26:34
TVM Relay 类型系统完全指南:从静态类型、形状依赖类型到类型关系与 ADT 编译器深度学习模型优化 【免费下载链接】tvm Open deep learning compiler stack for cpu, gpu and specialized accelerators 项目地址: https://gitcode.com/gh_mirrors/tvm7/tvm 点击查看 免费下载 Relay 是 Apache TVM 中负责表达深度学习模型的计算图 IR&… · 2026/9/24 14:26:27
JFlash不认国产芯片?手把手教你添加GD32、HC32、FM33支持 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 14:58:47
Apache DolphinScheduler 自动化发版工具:tools/release 使用指南与源码解析 Apache DolphinScheduler 自动化发版工具:tools/release 使用指南与源码解析 【免费下载链接】dolphinscheduler Apache DolphinScheduler is the modern data orchestration platform. Agile to create high performance workflow with low-code 项目地址: https… · 2026/9/24 14:58:41
氧化锌避雷器测试仪使用操作规程:从文档到可复现的现场作业流程 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 14:58:41
django-cms 3.5.4 安全修复解析:plugin_type 参数的 XSS 注入漏洞与防御实践 CMS后端 【免费下载链接】django-cms The easy-to-use and developer-friendly enterprise CMS powered by Django 项目地址: https://gitcode.com/gh_mirrors/dj/django-cms 点击查看 免费下载 导读
本文围绕 django-cms 3.5.4 版本发布说明(docs/up… · 2026/9/24 14:58:41
什么是disklrucache4cj?仓颉生态磁盘缓存管理完全指南 什么是disklrucache4cj?仓颉生态磁盘缓存管理完全指南 【免费下载链接】disklrucache4cj 一个diskLruCache算法库 项目地址: https://gitcode.com/Cangjie-TPC/disklrucache4cj
disklrucache4cj 是一个用仓颉语言实现的开源磁盘缓存管理库,它采用… · 2026/9/24 14:58:41
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程 简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13
1D-CNN时间序列建模实战:从Conv1d原理到工业落地 简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26
柔软的L:汉语语流中被忽视的舌肌张力控制 1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44