web-dev-qa-db-ja.com

新しいURL()-WHATWG URL API

私はノードをいじっていて、URLクラスのインスタンスを取得しようとしています(これらの便利なプロパティのため)。お気に入り:

const { URL } = require('url');
(...)
http.createServer((request,response) => {
    let uri = new URL(request.url);
    (...)
}

しかし、それは失敗します

TypeError [ERR_INVALID_URL]: Invalid URL: /

それは面白いです

const url = require('url');
url.parse();

動作します。それで私はそれについて知りました。私はこの後者の方法が古いことを理解しています。

私はローカルで開発しているので、リクエストを送信するにはブラウザでlocalhost:8000を使用します。

requestの情報を使用して新しいURLオブジェクトをインスタンス化するにはどうすればよいですか?

情報と私がすでに見たもの:

node -v
v9.3.0

https://nodejs.org/api/url.html#url_class_url
https://stackoverflow.com/questions/44738065/uncaught-typeerror-url-is-not-a-constructor-using-whatwg-url-object-support-for
https://stackoverflow.com/questions/45047840/in-node-js-how-to-get-construct-url-string-from-whatwg-url-including-user-and-pa
https://stackoverflow.com/questions/47481784/does-url-parse-protect-against-in-a-url
https://stackoverflow.com/questions/17184791/node-js-url-parse-and-pathname-property
10
Thomazella

Joshua WiseがGithub( https://github.com/nodejs/node/issues/12682 )で指摘したように、問題はrequest.urlが絶対URLではないことです。パスまたは相対URLとして使用できますが、ホストとプロトコルがありません。

APIドキュメント に続いて、2番目の引数としてベースURLを指定することにより、有効なURLを構築できます。プロトコルはrequest.headersから簡単に利用できないため、これは依然として厄介です。私は単にHTTPを想定しました:

var baseURL = 'http://' + request.headers.Host + '/';
var myURL = new URL(request.url, baseURL);

これは明らかに理想的なソリューションではありませんが、少なくともクエリ文字列の解析を利用できます。例えば、

URL {
  href: 'http://localhost:8080/?key1=value1&key2=value2',
  Origin: 'http://localhost:8080',
  protocol: 'http:',
  username: '',
  password: '',
  Host: 'localhost:8080',
  hostname: 'localhost',
  port: '8080',
  pathname: '/',
  search: '?key1=value1&key2=value2',
  searchParams: URLSearchParams { 'key1' => 'value1', 'key2' => 'value2' },
  hash: '' }
6
Jeshurun Hembd