如何使用express / Node.js 重定向 URL,同时维护所有 GET 参数

问题描述 投票:0回答:2

使用 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)
});
node.js express get http-redirect
2个回答
1
投票

使用

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

也是如此

0
投票

由于之前使用 URL.format() 的答案已被弃用,因此这里有一个简单的方法来实现相同的效果:

app.get('/old-endpoint', function (req, res) {
    const requestData = new URLSearchParams(req.query);
    res.redirect('/new-endpoint?'+requestData.toString());
});
© www.soinside.com 2019 - 2024. All rights reserved.