Javascript URL重写在Express 4.14.1中不起作用

Javascript URL重写在Express 4.14.1中不起作用,javascript,express,Javascript,Express,我在很多SO帖子中发现,为了在Express 4中重写URL,我将执行以下操作: router.use('/one/:someId', (req, res, next) => { req.url = `/two/${req.params.someId}`; next(); }); router.get('/one/:someId', (req, res) => { res.send("reached /one/:someId"); }); router.g

我在很多SO帖子中发现,为了在Express 4中重写URL,我将执行以下操作:

router.use('/one/:someId', (req, res, next) => {
    req.url = `/two/${req.params.someId}`;
    next();
});

router.get('/one/:someId', (req, res) => {
    res.send("reached /one/:someId");
});

router.get('/two/:someId', (req, res) => {
    res.send("reached /two/:someId");
});
但当我尝试此操作时,不仅URL没有更改为我期望的“/two/some integer”并保持为“/one/some integer”,而且它会进入我在应用程序文件中设置的404-not Found页面

此路由位于路由器文件中,我还尝试将URL设置为:

req.url = `/routerPath/two/${req.params.someId}`;
但结果完全一样

那么我会错过什么呢


谢谢。

您必须区分两种重定向:

  • 内部重定向在服务器上工作,而客户端没有注意到。它们为您的服务器编程提供了便利,而且从来都不是必需的—您可以始终引入一个由所有端点调用的helper方法
  • HTTP重定向建议客户端(例如web浏览器)转到其他URL。因为您希望URL发生更改,所以这就是您想要的
只需调用,确保对特殊字符进行编码:

router.get('/one/:someId', (req, res) => {
    res.redirect(`/two/${encodeURIComponent(req.params.someId)}`);
});

router.get('/two/:someId', (req, res) => {
    res.render("reached /two/:someId");
});

您必须区分两种重定向:

  • 内部重定向在服务器上工作,而客户端没有注意到。它们为您的服务器编程提供了便利,而且从来都不是必需的—您可以始终引入一个由所有端点调用的helper方法
  • HTTP重定向建议客户端(例如web浏览器)转到其他URL。因为您希望URL发生更改,所以这就是您想要的
只需调用,确保对特殊字符进行编码:

router.get('/one/:someId', (req, res) => {
    res.redirect(`/two/${encodeURIComponent(req.params.someId)}`);
});

router.get('/two/:someId', (req, res) => {
    res.render("reached /two/:someId");
});

谢谢你的回答。这是学习Express特性和功能的众多练习之一。问题是,如果我使用重定向,我会丢失一些上下文,我正试图通过req对象中的参数将其发送到第二个端点。另外,从您的回答来看,似乎中间件的整个思想并不是真正必要的,因为通过使用helper方法,您可以显式地调用它们,而不是依赖于仔细地将每个方法按正确的顺序排列。你同意还是我遗漏了什么?如果你想保留参数,你有四个选择:要么在URL中对它们进行编码(即重定向到
/two/$someid?param1=foo¶m2=bar
),要么将它们存储在客户端以供进一步处理(例如使用cookie),要么将它们存储在服务器上以供进一步处理(也需要会话管理,即cookies)或(仅POST)使用HTTP代码307重定向,以便客户端重新发送整个POST正文。[续…]…是的,中间件总是相当于在每个受影响的处理程序中调用的助手函数。中间件的优点是,您不必在每个处理程序中显式调用它。如果有许多处理程序应用中间件,这一点很重要。在这种情况下,只有两个处理程序共享代码,因此它没有那么大交易。无论您使用的是内部重定向的中间件还是助手功能,对于客户端来说,URL都将保持
/one/foobar
。感谢您的回答。这是学习Express的功能和能力的众多练习之一。问题是,如果我使用重定向,我会丢失一些试图发送给sec的上下文通过req对象中的参数进行ond结束点。另外,从您的回答来看,中间件的整个概念似乎不是真正必要的,因为通过使用helper方法,您可以显式地调用它们,而不是依赖于仔细地将每个方法按正确的顺序排列。您同意吗?还是我遗漏了什么?如果您想保留参数rs,您有四个选项:要么在URL中对它们进行编码(即重定向到
/two/$someid?param1=foo¶m2=bar
),要么将它们存储在客户端以供进一步处理(例如使用cookie),要么将它们存储在服务器上以供进一步处理(也需要会话管理,即cookies),或者(仅发布)使用HTTP代码307重定向,以便客户端重新发送整个帖子正文。[续…]…是的,中间件总是相当于在每个受影响的处理程序中调用的助手函数。中间件的优点是,您不必在每个处理程序中显式调用它。如果有许多处理程序应用中间件,这一点很重要。在这种情况下,只有两个处理程序共享代码,因此它没有那么大交易。无论您使用的是内部重定向的中间件还是助手功能,对于客户端,URL都将保持
/one/foobar