反序列化 Azure Functions 中的 DeepObject 查询字符串键 / Javascript

Deserialize DeepObject Querystring Keys in Azure Functions / Javascript

我们正在使用 Azure Functions 构建一个 API,规范要求在 GET 请求的查询字符串中引用 DeepObject。因此,结构看起来像 https://example.com/api/persons?name[first]=Todd。期望的是 一些 的查询键 可能 是 DeepObject 引用,其他的将是扁平的。

显然 Express 可以处理这种模式,但 Azure Functions 使用 ASP.NET 路由器。期望上面的引用 应该 反序列化为 req.params: { name: { first: "Todd" } }。但是,输出看起来像 req.params: { "name[first]": "Todd" }.

我真的很想不必 regex/search 每个键,所以有人知道是否:

  1. ASP.NET里有个config/flag支持这个结构?
  2. Javascript 中有一个很好的模式可以以某种功能性的——或者至少是非特殊的——方式反序列化它?

注意:任何建议使用eval()方法的人都不会被选中。但是对于演奏,您会带回家带有 90 年代参考的评论,因为那是过去十年,该方法的使用被认为是可以接受的。 :stuck_out_tongue_winking_eye:

对于这个问题,我认为我们不能改变一些配置来支持这种结构。我们能做的就是自己在代码中实现。

这是我的函数代码:

module.exports = async function (context, req) {
    console.log("======query url is:" + req.url);
    const result = queryStringToJSON(req.url);
    console.log(result);

    context.res = {
        body: "success"
    };
}

function queryStringToJSON(queryUrl) {
    if(queryUrl.indexOf('?') > -1){
      var queryString = queryUrl.split('?')[1];
    }
    var pairs = queryString.split('&');
    var result = {};
    pairs.forEach(function(pair) {
        if (pair.indexOf('[') > -1) {
            var nameObj = {};
            var firstObj = {};
            var nameStr = pair.substring(0, pair.indexOf('['));
            var firstStr = pair.substring(pair.indexOf('[')+1, pair.indexOf(']'));
            firstObj[firstStr] = pair.split('=')[1];
            nameObj[nameStr] = firstObj;
            Object.assign(result, nameObj);
        }else {
            pair = pair.split('=');
            result[pair[0]] = decodeURIComponent(pair[1] || '');
        }
    });
    return result;
}

启动功能项目,我用http://localhost:7071/api/HttpTrigger1?name[first]=Todd&email=test@mail.com请求。结果显示:

经过大量搜索,我无法找到在 ASP.NET 路由器中本地实现此功能的任何方法。尽管有很多关于如何在 ASP.NET 控制器函数中直接反序列化此结构的建议,但我在 Javascript.

中工作

有用的是 qs library,在 NPM 中可用,它支持与此查询字符串结构相关的许多细微差别。

const { query } = req;
// => { "name[first]": "Todd" };

const deserializedQuery = qs.parse(query);
// => { name: { first: "Todd" }

对我同样有帮助的是,我需要一种方法以相同的格式重组我的出站查询字符串。 Qs 与 Axios 中的 paramsSerializer 属性一起工作。

const params = { name: { first: "Todd" };
const paramsSerializer = (params) => { return Qs.stringify(params); };
const reqOptions = { params, paramsSerializer };

axios.get("https://example.com/api/persons", reqOptions);
// => GET https://example.com/api/persons?name[first]=Todd

感谢 @hury-shen 提供完全可行的解决方案。这不是我正在寻找的交钥匙解决方案。