Skip to content

Verifying url.format parameters #1764

@goloroden

Description

@goloroden

I have been using the code below:

request.post(url.format({
  protocol: 'http',
  host: 'localhost',
  port: port,
  pathname: '/my-route'
}), {
  body: { value: 'foobar' },
  json: true
}, function (err, res, body) {
  if (err) {
    return console.error(err);
  }
  console.log('Sent data.');
});

All I get is an EPIPE error. Finally, after two hours (!), I figured out what the problem was: It should be

url.format({
  protocol: 'http',
  hostname: 'localhost',
  port: port,
  pathname: '/my-route'
})

and not:

url.format({
  protocol: 'http',
  host: 'localhost',
  port: port,
  pathname: '/my-route'
})

So it's host vs hostname, and about ignoring the port when host is given. This error is quite annoying for several reasons:

  • In fairly complex applications, you first look for the error everywhere else (where more logic is involved).
  • host vs hostname is too easy to mix up.
  • There is no error message telling you that it doesn't make sense to provide a port if you use host instead of hostname.

So, to cut a long story short: Would verifying this be helpful?

What I'm thinking of is just a small test that checks whether you provide host and port. If so, it should tell you that port is ignored and you should either remove it, or use hostname instead.

What do you think?

Metadata

Metadata

Assignees

No one assigned

    Labels

    urlIssues and PRs related to the legacy built-in url module.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions