Nuxt encode/decode URI with double colon
我的网址上有两个冒号。
我将路径推到具有:的Nuxt路由器。
1 2 3 4 5 6 7 8 9 10 11 | export default { router: { extendRoutes (routes, resolve) { routes.push({ name: 'custom', path: 'towns' + '(:[0-9].*)?/', component: resolve(__dirname, 'pages/404.vue') }) } } } |
例如,当我指向http:// localhost:3000 / towns:3时,在导致此错误消息的URL上将:转换为
1 | Expected"1" to match":[0-9].*", but received"%3A2" |
如何将其还原为:?
我徒劳地尝试了encodeURI(),decodeURI(),encodeURIComponent()和decodeURIComponent()。
针对想要尝试的人的演示:nuxt-extend-routes
欢迎任何建议
Vuex使用
在我看来,您正在尝试使用无名参数,这是没有意义的,因为vue-router / vuex需要该参数的名称才能将其向下传递给路由后面的Vue组件
为什么不只使用命名参数?
1 2 3 4 5 | { path: '/towns:id(:\\\\d+)', name: 'Page 3', component: Page3 } |
当然,结果是
您可以查看此沙箱。它不是Nuxt,但我很确定它可以以相同的方式在Nuxt中工作....
更新资料
嗯,在Nuxt中它实际上不起作用。看来Nuxt出于某种原因在匹配的路径段上应用了
首先,我同意Michal Lev ??的回答,即此处存在库错误。在Nuxt源代码中,抛出错误的行在这里:
https://github.com/nuxt/nuxt.js/blob/112d836e6ebbf1bd0fbde3d7c006d4d88577aadf/packages/vue-app/template/utils.js#L523
您会注意到该段的几行已编码,导致
但是,此行似乎起源于正则表达式路径:
https://github.com/pillarjs/path-to-regexp/blob/v1.7.0/index.js#L212
修复此错误并非易事,因为编码不是简单的"错误"。这里有很多事情发生,直到到达该行时,参数值已经从其原始值进行了URL解码。如果我们的未编码
到正则表达式路径中的编码处理是一个微妙的话题,使用的旧版本对我们没有帮助。这也使得在您的应用程序中提出合适的解决方法变得更加困难。
所以,让我们看看我们能做什么...
首先,让我们考虑路径:
1 | path: 'towns' + '(:[0-9].*)?/', |
有点奇怪,可以像这样连接字符串,所以我将把它们组合起来:
1 | path: 'towns(:[0-9].*)?/', |
最后的
反面,开始时没有
这让我们有了:
1 | path: '/towns(:[0-9]+)?', |
现在是
通常,在两个方向上都使用路由路径:匹配/解析URL并构建URL。您对未命名参数的使用使我想知道您是否仅打算将此路由用于匹配目的。
一个选项可能是这样:
1 | path: '/towns:([0-9]+)', |
通过将
上面的代码有两个问题:
如果还需要使用它来构建URL,则可以改用命名参数:
1 | path: '/towns::town([0-9]+)', |
此处的
1 2 3 | <NuxtLink :to="{ name: 'custom', params: { town: 4 } }"> ... </NuxtLink> |