2017-04-05 24 views
0

我目前正在開發一個需要發送自定義GET HTTP請求的項目。NodeJs:任何方式繞過querystring.stringify與空的對象?

我使用的是默認的查詢字符串建設者:the Documentation

const querystring = require('querystring'); 

的問題是對對象(也可能爲空數組)如

extendTypes={} 

被serialiazed爲:

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 : ""); 
} 
+0

是您'querystring'對象? –

+0

這是一個inbuilded節點模塊:https://nodejs.org/api/querystring.html – jy95

+0

根據文檔,如果查詢字符串包含任何空參數,它將以'someVar ='的形式出現。 (例如,'querystring.stringify({foo:'bar',baz:['qux','quux'],corge:''})'會返回''foo = bar&baz = qux&baz = quux&corge =''(看看這裏的'corge'值) –

回答

0

我終於找到了一個解決辦法,如果有人想知道:

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); 
}