【问题标题】:NodeJs : Any way to bypass querystring.stringify with empty Object?NodeJs:有什么方法可以绕过带有空对象的 querystring.stringify?
【发布时间】:2017-08-31 07:46:46
【问题描述】:

我目前正在处理一个需要发送自定义 GET HTTP 请求的项目。

我正在使用默认的查询字符串生成器:the Documentation

const querystring = require('querystring');

问题在于对象(可能也用于空数组),例如

extendTypes={}  

被序列化为:

extendTypes=

预期结果:

extendTypes={}

或其 URI 编码版本:

extendTypes%3D%7B%7D

那么,我怎么能希望这样做呢?如果内置模块是不可能的,哪一个可以做我想做的。

如果需要,这是我的完整代码:

function generateGetRequest(dataMap, url) {

    let queryParams = {};
    let uriParams = {};

    for (let [key, value] of dataMap) {

        // if value is an object or an array
        if (value instanceof Object || value instanceof Array) {
            uriParams[key] = value;
        } else {
            // param working for superagent
            queryParams[key] = value;
        }

    }
    let queryParamsUri = querystring.stringify(uriParams);
    console.log(queryParamsUri);
    let finalUrl = url + ( (Object.keys(uriParams).length > 0) ? "?" + queryParamsUri : "");
}

【问题讨论】:

  • 你的querystring是一个对象吗?
  • 它是一个内置的节点模块:nodejs.org/api/querystring.html
  • 根据文档,如果查询字符串包含任何空参数,它将以someVar= 出现。 (例如,querystring.stringify({ foo: 'bar', baz: ['qux', 'quux'], corge: '' }) 将返回 'foo=bar&baz=qux&baz=quux&corge='(在此处查看 corge 值)。
  • 有什么办法绕过这个默认设置?内部文档没有任何迹象
  • 无关提示:如果您首先检查instanceof Object,则拥有instanceof Array 是没有用的,因为数组是Object 的实例。

标签: node.js query-string stringify superagent


【解决方案1】:

如果有人想知道,我终于找到了解决方法:

let request = require("superagent");

function generateGetRequest(dataMap, url) {

    let queryParams = {};
    let queryParamsUri = "";
    let isFirstParam = true;

    for (let [key, value] of dataMap) {

        // if value is an object or an array
        if (value instanceof Object) {

            // Workaround for empty object or array = https://github.com/nodejs/node/issues/12234
            queryParamsUri += ((!isFirstParam) ? "&": "") + key + "=" + JSON.stringify(value);
            // for next call
            isFirstParam = false;
        } else {
            // param working for superagent
            queryParams[key] = value;
        }
    }

    let finalUrl = url + ( (!isFirstParam) ? "?" + queryParamsUri : "");
    return request
        .get(finalUrl)
        .query(queryParams);
}

【讨论】:

    猜你喜欢
    • 2022-06-15
    • 2021-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多