Skip to content

Incorrect example of using new URL in docs #31301

@NMVikings

Description

@NMVikings
  • Version: all
  • Platform: all
  • Subsystem: url

In docs there is incorrect example of code: https://nodejs.org/api/http.html#http_message_url

Here is a quote from the documentation

START OF QUOTE
To parse the URL into its parts:

new URL(request.url, `http://${request.headers.host}`);

When request.url is '/status?name=ryan' and
request.headers.host is 'localhost:3000':

$ node
> new URL(request.url, request.headers.host)
URL {
  href: 'http://localhost:3000/status?name=ryan',
  origin: 'http://localhost:3000',
  protocol: 'http:',
  username: '',
  password: '',
  host: 'localhost:3000',
  hostname: 'localhost',
  port: '3000',
  pathname: '/status',
  search: '?name=ryan',
  searchParams: URLSearchParams { 'name' => 'ryan' },
  hash: ''
}

END OF QUOTE

The first code example is right. To parse request.url from localhost you need to use it:

new URL(request.url, `http://${request.headers.host}`);

But in the next code example new URL('/status?name=ryan', 'localhost:3000') resolves with URL Object, but it is incorrect behaviour. In real life it throws error

$ node
> new URL('/status?name=ryan', 'localhost:3000')
Uncaught TypeError [ERR_INVALID_URL]: Invalid URL: /status?name=ryan
    at onParseError (internal/url.js:257:9)
    at new URL (internal/url.js:333:5)
    at repl:1:1
    at Script.runInThisContext (vm.js:120:20)
    at REPLServer.defaultEval (repl.js:427:29)
    at bound (domain.js:429:14)
    at REPLServer.runBound [as eval] (domain.js:442:12)
    at REPLServer.onLine (repl.js:754:10)
    at REPLServer.emit (events.js:333:22)
    at REPLServer.EventEmitter.emit (domain.js:485:12) {
  input: '/status?name=ryan',
  code: 'ERR_INVALID_URL'
}

So the second code example should be:

$ node
> new URL(request.url, `http://${request.headers.host}`)
URL {
  href: 'http://localhost:3000/status?name=ryan',
  origin: 'http://localhost:3000',
  protocol: 'http:',
  username: '',
  password: '',
  host: 'localhost:3000',
  hostname: 'localhost',
  port: '3000',
  pathname: '/status',
  search: '?name=ryan',
  searchParams: URLSearchParams { 'name' => 'ryan' },
  hash: ''
}

Code example: https://repl.it/@NMVikings/URL

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions