【发布时间】:2018-04-13 17:42:59
【问题描述】:
我正在尝试创建一个函数,在给定路径的情况下,该函数将返回用于该路径的 Express 路由正则表达式。如果我有:
app.get('/a/b/c/:slug(a-z)', (req, res) => {
res.send('ok')
});
我希望能够有一个功能:
function getRoute(path) {
// ...
}
getRoute('/a/b/c/whatever') // => '/a/b/c/:slug(a-z0-9*)'
在一个请求中,我可以在req.route 访问一个快速路由对象。它看起来像这样:
{
"path":"/a/b/c/:slug(a-z0-9*)",
"stack":[ ... ],
"methods":{
"get":true
}
}
但我正在寻找一种在没有请求上下文的情况下执行此操作的方法,以便可以在任何地方调用它。我有app 上下文可用。 Express 应用程序中是否有某种路由工具可供我使用?
@jfriend00,这就是我想要做的。
我有一条路线,比如说:
app.get('/my-blog/:slug', (req, res) => {
...
});
并且该网站支持多种语言。假设我们有一篇名为“Hello World”的文章。在这种情况下,slug 是hello-world,所以路由是:
/my-blog/hello-world
不过,我也需要法语版本。所以现在的路线是:
app.get('/my-blog/:slug|/mon-blog/:slug', (req, res) => {
...
});
很酷,所以没问题。现在,该站点是服务器生成的,我正在使用i18n2 来翻译所有内容。我还需要翻译网站上的链接。但是,当我在法语页面上遇到 URL:/my-blog/hello-world 时,我需要将其翻译为 /mon-blog/bonjour-le-monde。假设一篇博客文章有一个法语和英语的 slug,并且可以被其中任何一个检索,那么所有这些 URL 都有效:
/mon-blog/bonjour-le-monde-
/my-blog/bonjour-le-monde(永远不会使用) -
/mon-blog/hello-world(永远不会使用) /my-blog/hello-world
如果用户的浏览器语言设置为法语,我还需要将到达/my-blog/hello-world 的用户重定向到/mon-blog/bonjour-le-monde。
我能想到的唯一解决方案是生成所有 URL 到其法语对应项的映射,这有点恶心。如果可能的话,我真的宁愿使用具有一流支持的东西。感谢您的意见。
【问题讨论】:
-
我不知道。 Express 中的匹配路由发生在传入请求对象的上下文中。您真正想在这里解决什么问题导致您提出这个要求?
-
Express 这样做是为了获得路由的请求路径,所以它必须在某个地方完成,不是吗?它是本地化 URL 解决方案的一部分,即使这些 URL 具有也能够本地化的参数。
-
是的,但是当 Express 执行此操作时,它是在您说您不想拥有的传入请求对象的上下文中完成的。您必须使用 Express 数据结构的内部来编写自己的代码才能找到它。你为什么要这样做?我不禁认为可能有一种更受支持的方式来攻击你正在尝试做的任何事情。
-
@jfriend00 我已经更新了我的问题,提供了有关该问题的更多详细信息。
-
那么,原来的问题是当用户的浏览器是法语时如何将链接
/my-blog/hello-world翻译成/mon-blog/bonjour-le-monde(并且对页面中的所有链接都这样做)?