Alana Storm
Alana Storm

Reputation: 166066

Node.js: Transform Request Options into Final URL

If I'm using Node.js, is there a way I can automatically turn a set of options for the request function into the final URL that Node.js will use for its HTTP request?

That is, if I have a set of options that I use like this

var http = require('http');

var options = {
  host: 'www.random.org',
  path: '/integers/?num=1&min=1&max=10&col=1&base=10&format=plain&rnd=new'
};

callback = function(response) {
  var str = '';

  //another chunk of data has been received, so append it to `str`
  response.on('data', function (chunk) {
    str += chunk;
  });

  //the whole response has been received, so we just print it out here
  response.on('end', function () {
  conso
    console.log(str);
  });
}

const req = http.request(options, callback).end();

Is there a way for me to transform

var options = {
  host: 'www.random.org',
  path: '/integers/?num=1&min=1&max=10&col=1&base=10&format=plain&rnd=new'
};

Into the string

www.random.org/integers/?num=1&min=1&max=10&col=1&base=10&format=plain&rnd=new

I realize for the above case this would be a trivial string concatenation.

const url = 'htts://' + options.host + options.path

What I'm interested in is code that can transform any options object into its final URL If I look to the manual, there's twenty one possible options for a request. Some might impact the final URL. Some might not. I'm hoping Node.js or NPM has a built in way of turning those options into a URL and save me the tedious work of doing it myself.

Upvotes: 0

Views: 255

Answers (1)

Delapouite
Delapouite

Reputation: 10167

Node.js originally offered the querystring module which has functions which seem to do what you need. For instance, the stringify function:

https://nodejs.org/dist/latest-v15.x/docs/api/querystring.html#querystring_querystring_stringify_obj_sep_eq_options

querystring.stringify({ foo: 'bar', baz: ['qux', 'quux'], corge: '' });
// Returns 'foo=bar&baz=qux&baz=quux&corge='

More recently, objects like URLSearchParams were introduced in the url module to better align with the WHATWG spec and therefore be more inline with APIs available in browswers:

https://nodejs.org/dist/latest-v15.x/docs/api/url.html#url_class_urlsearchparams

const myURL = new URL('https://example.org/?abc=123');
console.log(myURL.searchParams.get('abc'));
// Prints 123

myURL.searchParams.append('abc', 'xyz');
console.log(myURL.href);
// Prints https://example.org/?abc=123&abc=xyz

The approach you'll choose in the end depends of your specific business needs.

Upvotes: 1

Related Questions