From fd9d2cbbfa82c4cbef2903ed0fdbb837cbdf52d1 Mon Sep 17 00:00:00 2001 From: yangshangbo <42314632+yangshangbo@users.noreply.github.com> Date: Fri, 4 Jul 2025 16:23:53 +0800 Subject: [PATCH] feat: add middleware implementation --- example.v | 6 ++++++ hono/app.v | 25 +++++++++++++++++++++++-- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/example.v b/example.v index 8b85f78..23da4c4 100644 --- a/example.v +++ b/example.v @@ -101,6 +101,12 @@ fn main() { } }) + // 日志打印中间件示例 + app.use(fn (mut req hono.Request, next fn (mut hono.Request) http.Response) http.Response { + println('[LOG] ${req.url}') + return next(mut req) + }) + println('Server starting on :8080') println('测试静态路由: http://localhost:8080/') println('测试健康检查: http://localhost:8080/api/health') diff --git a/hono/app.v b/hono/app.v index 4959a64..7259a75 100644 --- a/hono/app.v +++ b/hono/app.v @@ -26,6 +26,7 @@ mut: pub mut: hybrid_router HybridRouter trie_router TrieRouter + middlewares []Middleware } pub fn (mut app Hono) get(path string, handler fn (Request) http.Response) { @@ -87,6 +88,12 @@ fn server_hanler_new(app Hono) ServerHanler { } } +type Middleware = fn (mut req Request, next fn (mut Request) http.Response) http.Response + +pub fn (mut app Hono) use(mw Middleware) { + app.middlewares << mw +} + fn (mut s ServerHanler) handle(req http.Request) http.Response { mut res := http.Response{ status_code: 404 @@ -111,17 +118,31 @@ fn (mut s ServerHanler) handle(req http.Request) http.Response { // body body := req.data // 构造 hono.Request - hreq := Request{ + mut hreq := Request{ url: url.path param: param_map query: query_map body: body } - res = route_match.handler.handle(hreq) + // 洋葱模型递归执行中间件 + return s.exec_middlewares(0, mut hreq, fn [route_match] (req Request) http.Response { + return route_match.handler.handle(req) + }) } return res } +fn (mut s ServerHanler) exec_middlewares(idx int, mut req Request, handler fn (Request) http.Response) http.Response { + if idx < s.app.middlewares.len { + mw := s.app.middlewares[idx] + return mw(mut req, fn [mut s, idx, handler] (mut r Request) http.Response { + return s.exec_middlewares(idx+1, mut r, handler) + }) + } else { + return handler(req) + } +} + pub fn (mut app Hono) listen(port string) { app.server.addr = port app.server.handler = server_hanler_new(app)