如何使用Hono路由匹配带文件扩展名的参数且不将扩展名包含在提取值中?
如何使用Hono路由匹配带文件扩展名的参数且不将扩展名包含在提取值中?
我太懂这种刚从Express转Hono的困惑了!明明在Express里/users/:id.json就能直接把123从/users/123.json里提出来,到Hono里突然找不到现成的写法,文档没明说的时候确实挠头。
其实Hono的路由支持用正则表达式来约束参数匹配规则,这就是解决这个问题的关键。直接在路由参数后面加个正则,就能精准捕获到扩展名前面的内容,完全不用额外处理字符串。
给你举个最直接的例子:
import { Hono } from 'hono' const app = new Hono() // 匹配带.json后缀的动态参数,提取不带后缀的值 app.get('/:id([^.]+).json', (c) => { const id = c.req.param('id') // 比如请求 /123.json 时,id 就是 '123' return c.json({ extractedId: id }) }) // 嵌套路由的情况也一样 app.get('/posts/:postSlug([^.]+).json', (c) => { const postSlug = c.req.param('postSlug') // 请求 /posts/my-first-post.json 时,postSlug 是 'my-first-post' return c.json({ postSlug }) }) Deno.serve(app.fetch)
这里的[^.]+正则是核心,它的意思是匹配任意非英文句号的字符,所以会自动把.前面的所有内容捕获为参数值,后面的.json是路由里的固定后缀,Hono会精准匹配这部分路径,不会把后缀包含到参数里。
如果之后你需要支持多种扩展名(比如.json和.xml),也可以扩展正则:
app.get('/:id([^.]+)\.(json|xml)', (c) => { const id = c.req.param('id') // 还可以通过路径切割获取扩展名 const ext = c.req.path.split('.').pop() return c.json({ id, extension: ext }) })
这种路由层面直接处理的方式比用中间件去切割路径要优雅得多,完全贴合Hono的路由设计逻辑,和Express里的写法效果一致,只是需要多写个简单的正则而已。
内容来源于stack exchange
相关产品推荐
相关产品推荐

