如何在Oak/Deno中为路由参数添加扩展名?
解决带参数URL的.rss扩展名路由问题
你的路由配置无法正常工作,核心原因是:tag会匹配包含.在内的任意字符,导致请求时.rss被当成了tag参数的一部分(比如请求/searches/history/tags/node.rss时,tag的值会变成node.rss)。下面是几种可行的解决方法:
方法1:用正则约束参数匹配范围
在路由参数后加上正则表达式,限定tag只匹配不含.的字符,这样就能把.rss从参数里分离出来:
.get( "\/searches\/history\/tags\/:tag([^.]+).rss", controller.getHistoryByTagRss.bind(controller) )
这里[^.]+表示匹配任意非.的字符,确保tag参数只取到.之前的部分。
方法2:使用完整正则路由
直接用正则表达式定义整个路由,明确捕获tag部分:
.get( /^\/searches\/history\/tags\/([^.]+)\.rss$/, controller.getHistoryByTagRss.bind(controller) )
这种方式下,你需要在控制器里通过req.params[0]来获取tag的值。
方法3:拆分参数与扩展名(通用兼容方案)
把扩展名也设为一个参数,然后在控制器里校验是否为rss:
.get( "\/searches\/history\/tags\/:tag.:ext", (req, res, next) => { if (req.params.ext !== 'rss') return next(); controller.getHistoryByTagRss.bind(controller)(req, res, next); } )
这种方式更灵活,同时可以过滤掉非.rss的请求。
内容的提问来源于stack exchange,提问作者chovy
相关产品推荐
相关产品推荐

