Skip to content

非公式本サイトは非公式の日本語ドキュメントであり、Cloudflare 公式サイトではありません。最新情報はdevelopers.cloudflare.comをご確認ください。

https

最終更新 Markdown で表示Agent セットアップ

互換性フラグ

クライアント側のメソッド

HTTPS のクライアント側メソッド(https.gethttps.request など)を使うには、nodejs_compat フラグに加えて enable_nodejs_http_modules 互換性フラグを有効にする必要があります。

このフラグは、nodejs_compat が有効で、互換性日付2025-08-15 以降の Worker では自動で有効になります。それより前の互換性日付を使う Worker では、wrangler.toml にフラグを追加して手動で有効にできます。

compatibility_flags = ["nodejs_compat", "enable_nodejs_http_modules"]

サーバー側のメソッド

HTTPS のサーバー側メソッド(https.createServerhttps.Serverhttps.ServerResponse)を使うには、nodejs_compat フラグに加えて enable_nodejs_http_server_modules 互換性フラグを有効にする必要があります。

このフラグは、nodejs_compat が有効で、互換性日付2025-09-01 以降の Worker では自動で有効になります。それより前の互換性日付を使う Worker では、wrangler.toml にフラグを追加して手動で有効にできます。

compatibility_flags = ["nodejs_compat", "enable_nodejs_http_server_modules"]

クライアント側とサーバー側の両方のメソッドを使う場合は、両方のフラグを有効にします。

compatibility_flags = ["nodejs_compat", "enable_nodejs_http_modules", "enable_nodejs_http_server_modules"]

get

Node.js の https.get メソッドの実装です。

get は指定した URL へ GET リクエストを送り、レスポンスをコールバックに渡します。リクエストオプションを手で設定せずに HTTPS GET を送れる便利なメソッドです。

getfetch(...) のラッパーのため、エクスポートした fetch ハンドラー(または同等のハンドラー)の中でのみ使えます。そのようなハンドラーの外で get を使うとエラーになります。

import { get } from "node:https";

export default {
	async fetch() {
		const { promise, resolve, reject } = Promise.withResolvers();
		get("https://example.com", (res) => {
			let data = "";
			res.setEncoding("utf8");
			res.on("data", (chunk) => {
				data += chunk;
			});
			res.on("end", () => {
				resolve(new Response(data));
			});
			res.on("error", reject);
		}).on("error", reject);
		return promise;
	},
};

Workers での get の実装は、グローバルな fetch API のラッパーです。そのため、同じ 制限 が適用されます。

上の例のとおり、fetch ハンドラー内ではプロミスなどでリクエストの完了を待つ必要があります。待たないと、ハンドラーが return した時点で fetch が途中でキャンセルされることがあります。

request

Node.js の https.request メソッドの実装です。

request は、メソッド、ヘッダー、本文などのオプションを指定して HTTPS リクエストを作成します。リクエスト設定を細かく制御でき、リクエストデータを送るための Node.js stream.Writable を返します。

requestfetch(...) のラッパーのため、エクスポートした fetch ハンドラー(または同等のハンドラー)の中でのみ使えます。そのようなハンドラーの外で request を使うとエラーになります。

request メソッドは http.request のすべてのオプションを受け付けます。デフォルト値には次の違いがあります。

  • protocol: デフォルトは https:
  • port: デフォルトは 443
  • agent: デフォルトは https.globalAgent
import { request } from "node:https";
import { strictEqual, ok } from "node:assert";

export default {
	async fetch() {
		const { promise, resolve, reject } = Promise.withResolvers();
		const req = request(
			"https://developers.cloudflare.com/robots.txt",
			{
				method: "GET",
			},
			(res) => {
				strictEqual(res.statusCode, 200);
				let data = "";
				res.setEncoding("utf8");
				res.on("data", (chunk) => {
					data += chunk;
				});
				res.once("error", reject);
				res.on("end", () => {
					ok(data.includes("User-agent"));
					resolve(new Response(data));
				});
			},
		);
		req.end();
		return promise;
	},
};

次の追加オプションはサポートしていません: cacertciphersclientCertEngine(非推奨)、crldhparamecdhCurvehonorCipherOrderkeypassphrasepfxrejectUnauthorizedsecureOptionssecureProtocolservernamesessionIdContexthighWaterMark

createServer

Node.js の https.createServer メソッドの実装です。

createServer は、受信したセキュアなリクエストを処理できる HTTPS サーバーインスタンスを作成します。新しい Server インスタンスを作り、必要に応じてリクエストリスナーのコールバックを設定する便利な関数です。

import { createServer } from "node:https";
import { httpServerHandler } from "cloudflare:node";

const server = createServer((req, res) => {
	res.writeHead(200, { "Content-Type": "text/plain" });
	res.end("Hello from Node.js HTTPS server!");
});

server.listen(8080);
export default httpServerHandler({ port: 8080 });

httpServerHandler 関数は、Node.js の HTTPS サーバーを Cloudflare Workers のリクエストモデルに接続します。Worker にリクエストが届くと、ハンドラーは指定したポートで動いている Node.js サーバーへ自動でルーティングします。この橋渡しにより、使い慣れた Node.js のサーバーパターンを使いつつ、自動スケーリング、エッジへのデプロイ、ほかの Cloudflare サービスとの連携といった Workers ランタイムの利点を得られます。

Agent

Node.js の https.Agent クラスの実装です。

Agent は、ホスト/ポートごとにリクエストキューを持ち、HTTPS 接続の再利用を管理します。ただし Workers 環境では、ネットワーク接続やポートなどの低レベル管理は Cloudflare のインフラが行うため、この層は関係しません。そのため、Workers の Agent はスタブ実装であり、コネクションプーリングや keep-alive はサポートしません。

Server

Node.js の https.Server クラスの実装です。

Node.js では、https.Server クラスは HTTPS サーバーを表し、受信したセキュアなリクエストを処理するメソッドを提供します。Workers ではセキュアなリクエストの処理は Cloudflare のインフラが行うため、https.Serverhttp.Server に大きな違いはありません。完全性のためにランタイムは実装を提供しますが、ほとんどの Worker では http.Server を使う方がよいです。

import { Server } from "node:https";
import { httpServerHandler } from "cloudflare:node";

const server = new Server((req, res) => {
	res.writeHead(200, { "Content-Type": "application/json" });
	res.end(JSON.stringify({ message: "Hello from HTTPS Server!" }));
});
server.listen(8080);
export default httpServerHandler({ port: 8080 });

Workers の実装と Node.js には、次の違いがあります。

  • closeAllConnections()closeIdleConnections() などの接続管理メソッドは、Workers 環境の性質上、実装していません。
  • listen() は、ポート番号あり、または引数なしのバリアントだけをサポートします。listen()listen(0, callback)listen(callback) などです。
  • 次のサーバーオプションはサポートしていません: maxHeaderSizeinsecureHTTPParserkeepAliveTimeoutconnectionsCheckingInterval
  • cacertkeypfxrejectUnauthorizedsecureProtocol などの TLS/SSL 固有オプションは、Workers 環境ではサポートしていません。mTLS が必要な場合は mTLS バインディング を使います。

Node.js と Workers の node:https 実装のその他の違い

Workers の node:https 実装はグローバルな fetch API のラッパーです。そのため、Node.js と比べて次の挙動の違いがあります。

  • Connection ヘッダーは使いません。接続は Workers が自動管理します。
  • Content-Length ヘッダーの扱いは fetch API と同じです。本文がある場合はヘッダーが自動設定され、手動で設定した値は無視されます。
  • Expect: 100-continue ヘッダーはサポートしていません。
  • トレイリングヘッダーはサポートしていません。
  • 'continue' イベントはサポートしていません。
  • 'information' イベントはサポートしていません。
  • 'socket' イベントはサポートしていません。
  • 'upgrade' イベントはサポートしていません。
  • 基盤となる socket への直接アクセスはサポートしていません。
  • cacertkeyrejectUnauthorized などの TLS 固有オプションの設定はサポートしていません。

役に立ちましたか?