You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

express-graphql子路由匹配父路由:是否为预期行为?有无解决办法?

问题解答

这绝对是很多路由匹配系统的预期行为——我之前在做类似的GraphQL路由挂载时也踩过这个坑!核心原因是大多数路由匹配器默认采用前缀优先+顺序匹配的逻辑:当请求路径/creator/item/price进来时,匹配器会从已注册的路由里找第一个前缀匹配的项,而/creator/item正好是它的前缀,所以就直接命中了第一个路由,不会继续往后匹配更具体的路径。

不过完全不用非得改成完全唯一的路径名,有几个靠谱的解决办法:

1. 调整路由注册顺序

更具体的路由放在前面注册。比如先挂载/creator/item/price,再挂载/creator/item。因为大多数框架(Express、Fastify、Apollo Server等)都是按注册顺序进行匹配,先遇到更精准的路径,就会优先匹配它,不会再落到通用前缀的路由上。

举个Express的例子:

// 先注册更具体的路由
app.use('/creator/item/price', priceRouter);
// 再注册通用前缀路由
app.use('/creator/item', itemRouter);

2. 开启严格路由匹配模式

很多路由框架都提供了严格匹配的配置项,开启后,只有当请求路径和路由定义完全一致时才会命中,不会匹配前缀。

比如Express里可以在路由配置中添加strict: true

app.use('/creator/item', { strict: true }, itemRouter);
app.use('/creator/item/price', priceRouter);

开启后,/creator/item只会匹配完全等于这个路径的请求,/creator/item/price就会正常匹配到对应的路由。

3. 给路由添加精确匹配标识

如果是使用GraphQL相关的路由挂载(比如Apollo Server),可以结合框架的精确匹配选项。比如在使用expressMiddleware时,明确指定路由的精确匹配规则,避免前缀命中的情况。

总结一下:这不是必须用唯一路径的问题,只要调整匹配规则或者注册顺序,就能让两个路由正常区分开。

内容的提问来源于stack exchange,提问作者A. L

火山引擎 最新活动