使用 Express/Node.js,我收到带有未知数量参数的 GET 请求。参数的名称并不总是事先知道的。我需要将这些请求重定向到新的 URL,同时保留所有现有的 GET 参数。
即。我可能会得到其中任何一个
http://example.com/example
http://example.com/example?id=xxx
http://example.com/example?a=xxx&_b=xxx...
etc
这又需要重定向到:
http://newexample.com/example
http://otherdomain.org/sample?type=new&id=xxx
http://newexample.com/sample?a=xxx&_b=xxx...
etc
我编写了这段代码来实现这一点,但感觉这将是框架中已经存在的常见功能。有更好的办法吗?
app.get('/example', function(req, res){
var oldParams = ""
var redirectUrl = config.exampleUrlNew;
if (req.originalUrl != null && req.originalUrl.indexOf('?') > 0) {
oldParams = req.originalUrl.split("?")[1];
}
if (oldParams != "" && redirectUrl.indexOf('?') > 0) {
oldParams = "&" + oldParams;
} else {
oldParams = "?" + oldParams;
}
res.redirect(redirectUrl + oldParams)
});
url
模块
var URL = require('url');
var newUrl = URL.parse(oldUrl, true); // true to parse the queryString as well
newUrl.host = null; // because
newUrl.hostname = 'newexample.com';
newUrl.search = null; // because
newUrl.query.newParam = 'value';
newUrl = URL.format(newUrl);
有一个怪癖,您必须将
.host
属性设置为 null 才能使 .hostname
属性优先,因为根据文档设置 hostname
仅在 host
不存在时才有效,因为这是因为它是从 oldUrl 解析的。 .search
和 .query
也是如此
由于之前使用 URL.format() 的答案已被弃用,因此这里有一个简单的方法来实现相同的效果:
app.get('/old-endpoint', function (req, res) {
const requestData = new URLSearchParams(req.query);
res.redirect('/new-endpoint?'+requestData.toString());
});