【发布时间】:2012-11-19 00:11:37
【问题描述】:
是否可以使用 node.js 重写 URL 路径?(我也在使用 Express 3.0)
我尝试过这样的事情:
req.url = 'foo';
但是网址还是一样的
【问题讨论】:
是否可以使用 node.js 重写 URL 路径?(我也在使用 Express 3.0)
我尝试过这样的事情:
req.url = 'foo';
但是网址还是一样的
【问题讨论】:
当然,只需添加一个中间件函数即可对其进行修改。例如:
app.use(function(req, res, next) {
if (req.url.slice(-1) === '/') {
req.url = req.url.slice(0, -1);
}
next();
});
此函数从所有传入请求 URL 中删除尾部斜杠。请注意,为了使其正常工作,您需要将其放在调用 app.use(app.router) 之前。
【讨论】:
Request 实例将 req 属性定义为非 writable。
req.path 而不是req.url。 req.url 是 Http.IncomingMessage 的属性,所以可以设置。你原来的答案是正确的。抱歉!
最好也更新path。我的方法建议:
app.use(function(req, res, next) {
console.log("request", req.originalUrl);
const removeOnRoutes = '/not-wanted-route-part';
req.originalUrl = req.originalUrl.replace(removeOnRoutes,'');
req.path = req.path.replace(removeOnRoutes,'');
return next();
});
这样/not-wanted-route-part/users就会变成/users
【讨论】:
您需要覆盖 req 的一些属性(NodeJs 中的 IncomingMessage):
2
function changeUrl(req, url) {
const parsedUrl = new URL(url);
req.url = url;
req.originalUrl = url;
req.path = parsedUrl.pathname;
req.search = parsedUrl.search;
req._parsedUrl = parsedUrl;
const query = {};
for(const entry of parsedUrl.searchParams) {
query[entry[0]] = entry[1];
}
req.query = query;
}
【讨论】: