来自 express 的 GET 或 POST 不解析 "percent sign" 请求

GET or POST from express do not parse a "percent sign" request

我在解析使用“%26”而不是“&”字符的 HTTP 请求时遇到困难。

上下文:我正在尝试接收由 IP 摄像机发出的 HTTP 请求,该请求具有无法发送“&”字符的限制,因此我必须使用“%26”来设置它来分隔参数,所以相机正在发出这样的 POST 请求:

http://192.168.45.4:8000/test?foo=me%26bar=them

为了在我的服务器端处理这个请求,我有这个简单的函数:

Broker.all("*", (req,res) => {
    console.log("foo=" + req.query.foo);
    console.log("bar=" + req.query.bar);

    console.log("Received a generic put request");
    res.send("Processed");
});

当我使用“&”字符发出请求时,这段代码工作正常。

这是请求的结果:http://192.168.45.4:8000/test?foo=me&bar=them

foo=me
bar=them
Received a generic put request

这是请求的结果:http://192.168.45.4:8000/test?foo=me%26bar=them

foo=me&bar=them
bar=undefined
Received a generic put request

我一直在为过去敲我的头......(羞愧)......不管多少小时,我不确定我做错了什么。 我很确定这很容易,但我真的无法在论坛上找到它,可能是因为我无法在帖子中专门搜索“%26”。 任何帮助将不胜感激。

解决后编辑

按照 GPack 的建议,我使用了他的解析器代码,它似乎可以工作。只需要确保事先检查 Generic URL 是否有参数。 我仍然相信使用 express 可能有更自然的方法来做到这一点...

这是解析器正在运行的新代码:

broker.all("*", (req,res) => {

    const list = req.originalUrl.split("?")[1].split("%26");
    const params = list.reduce((obj, str) => {
        const parts = str.split("=");
        obj[parts[0]] = parts[1];
        return obj;
    }, {});
    console.log(params); // { bar: "them", foo: "me" }
    
    console.log("foo=" + params.foo);
    console.log("bar=" + params.bar);

    console.log("Received a generic put request");
    res.send("I'm just a simple broker");
});

我尝试使用 decodeURI 和 decodeURIComponent 但没有成功。
所以我自己写了解析器:

// The request object should be something like this (with other attributes)
const req = {
  originalUrl: "/test?foo=me%26bar=them"
}

// You may want to handle the case where a request doesn't have parameters
const list = req.originalUrl.split("?")[1].split("%26");
const params = list.reduce((obj, str) => {
  const parts = str.split("=");
  obj[parts[0]] = parts[1];
  return obj;
}, {});
console.log(params); // { bar: "them", foo: "me" }