使用不同数量的参数构建HTTP请求?

时间:2015-02-05 10:44:26

标签: node.js

我试图编写一个节点函数,它将根据传递给它的参数构建一个URL,然后使用request.js进行HTTP GET。

只要存在一个参数,我无法弄清楚如何最好地处理URL有效的事实。把我的功能作为

track = function(company, employee, app) {
  var url = "http://127.0.0.1:8000/?"+"company="+company+"&app="+app+"&employee="+employee;
  request(url, function (error, response, body) {
  })
};

所以如果我用所有3个参数调用它,结果URL将是有效的并由我的服务器处理

track("google", "larry", "chrome")
http://127.0.0.1:8000/?company=google&app=larry&employee=chrome

由这些参数的1/2/3组合产生的所有可能的URL也都有效

http://127.0.0.1:8000/?company=google
http://127.0.0.1:8000/?company=google&app=chrome
http://127.0.0.1:8000/?employee=larry

就目前而言,如果我只想发送employee=larry的跟踪请求并通过track("larry")调用该功能,则该网址将

http://127.0.0.1:8000/?company=larry&app=undefined&employee=undefined

如何编写我的函数以允许不同的参数排列?我知道我可以检查每个参数的存在,并为每个排列设置if / else条件,但我正在寻找更有效的方法。

2 个答案:

答案 0 :(得分:3)

最终,你不能拥有固定的参数,省略它们,并期望函数知道如何处理它。只有两种方法可以做你想做的事情

  • 传递参​​数映射(例如,作为对象传递,arguments
  • 为您要省略的参数传递null(或其他一些默认值)

使用固定参数方法,您可以构建一个数组,然后使用join为您提供一个很好的查询字符串

var params = [];
if (company) {
    params.push("company=" + company);
}
if (employee) {
    params.push("employee=" + employee);
}
if (app) {
    params.push("app=" + app);
}
var url = "http://127.0.0.1:8000/?" + params.join("&");
...
track("google", "larry", "chrome");
track("google", null, "chrome");
track(null, "larry", null);

Fiddle

答案 1 :(得分:2)

传递对象而不是单独参数列表。

function track(params) {
    var url = 'http://127.0.0.1:8000/?'
    var arr = [];
    for (var p in params) {
        arr.push(p + '=' + params[p]);
    }
    request(url + arr.join('&'), function (err, res, body) { //... });
}

track({
    name: 'Larry',
    company: 'Google'
});

DEMO