You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 13:33:06