Skip to content

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

http

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

互換性フラグ

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

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

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

{
	"compatibility_flags": [
		"nodejs_compat",
		"enable_nodejs_http_modules"
	]
}
compatibility_flags = [ "nodejs_compat", "enable_nodejs_http_modules" ]

サーバー側のメソッド

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

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

{
	"compatibility_flags": [
		"nodejs_compat",
		"enable_nodejs_http_server_modules"
	]
}
compatibility_flags = [ "nodejs_compat", "enable_nodejs_http_server_modules" ]

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

{
	"compatibility_flags": [
		"nodejs_compat",
		"enable_nodejs_http_modules",
		"enable_nodejs_http_server_modules"
	]
}
compatibility_flags = [
  "nodejs_compat",
  "enable_nodejs_http_modules",
  "enable_nodejs_http_server_modules"
]

get

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

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

getfetch(...) のラッパーのため、エクスポートした fetch ハンドラーまたは同様のハンドラー内でのみ使えます。そうしたハンドラーの外で get を使うと、エラーがスローされます。

import { get } from "node:http";

export default {
	async fetch() {
		const { promise, resolve, reject } = Promise.withResolvers();
		get("http://example.org", (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 ハンドラーでは Promise を使ってリクエストの完了を正しく待つ必要があります。そうしないと、ハンドラーが戻った時点で fetch が途中でキャンセルされることがあります。

request

Node.js の `http.request' メソッドの実装です。

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

requestfetch(...) のラッパーのため、エクスポートした fetch ハンドラーまたは同様のハンドラー内でのみ使えます。そうしたハンドラーの外で request を使うと、エラーがスローされます。

import { get } from "node:http";

export default {
	async fetch() {
		const { promise, resolve, reject } = Promise.withResolvers();
		get(
			{
				method: "GET",
				protocol: "http:",
				hostname: "example.org",
				path: "/",
			},
			(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)
			.end();
		return promise;
	},
};

Cloudflare Workers の node:http はグローバルな fetch API のラッパーであるため、request(および get)に渡す次のオプションはサポートしません。

  • maxHeaderSize
  • insecureHTTPParser
  • createConnection
  • lookup
  • socketPath

OutgoingMessage

OutgoingMessage クラスは、クライアントへ送る HTTP レスポンスを表します。レスポンスヘッダーと本体の書き込み、レスポンスの終了用メソッドを提供します。OutgoingMessage は Node.js の stream.Writable ストリームクラス を拡張します。

OutgoingMessage クラスは、送信 HTTP メッセージ(リクエストとレスポンスの両方)の基底クラスです。ヘッダーと本体データの書き込み、メッセージの終了用メソッドを提供します。OutgoingMessageWritable ストリームクラス を拡張します。

ClientRequestServerResponse は、どちらも OutgoingMessage を拡張し、そこから継承します。

IncomingMessage

IncomingMessage クラスは、クライアントから受け取る HTTP リクエストを表します。リクエストヘッダーと本体の読み取り、リクエストの終了用メソッドを提供します。IncomingMessageReadable ストリームクラスを拡張します。

IncomingMessage クラスは HTTP メッセージ(リクエストまたはレスポンス)を表します。ヘッダーと本体データの読み取り用メソッドを提供します。IncomingMessageReadable ストリームクラスを拡張します。

import { get, IncomingMessage } from "node:http";
import { ok, strictEqual } from "node:assert";

export default {
	async fetch() {
		// ...
		get("http://example.org", (res) => {
			ok(res instanceof IncomingMessage);
		});
		// ...
	},
};

Workers の実装では、IncomingMessage オブジェクトに cloudflare プロパティがあります。

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

const server = createServer((req, res) => {
	console.log(req.cloudflare.cf.country);
	console.log(req.cloudflare.cf.ray);
	res.write("Hello, World!");
	res.end();
});

server.listen(8080);

export default httpServerHandler({ port: 8080 });

cloudflare.cf プロパティには、Cloudflare 固有のリクエストプロパティ が含まれます。

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

  • Trailer ヘッダーはサポートしません
  • socket 属性は net.Socket を拡張しません。含まれるのは次のプロパティだけです。encryptedremoteFamilyremoteAddressremotePortlocalAddresslocalPort、および destroy() メソッドです。
  • 次の socket 属性は、Node.js と動作が異なります。
    • remoteAddress は、ローカル実行時に 127.0.0.1 を返します
    • remotePort は、2^15 から 2^16 のあいだのランダムなポート番号を返します
    • localAddress は、リクエストの host ヘッダーがあればその値を返します。なければ 127.0.0.1 を返します
    • localPort は、サーバーインスタンスに割り当てられたポート番号を返します
    • req.socket.destroy()req.destroy() にフォールスルーします

Agent

Node.js の `http.Agent' クラスの部分実装です。

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

import { Agent } from "node:http";
import { strictEqual } from "node:assert";

const agent = new Agent();
strictEqual(agent.protocol, "http:");

createServer

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

createServer メソッドは、受信リクエストを処理できる HTTP サーバーインスタンスを作成します。

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

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

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

Node.js との統合

httpServerHandler

httpServerHandler 関数は、Node.js HTTP サーバーを Cloudflare Workers のリクエストモデルに統合します。次の 2 つの API パターンをサポートします。

import http from "node:http";
import { httpServerHandler } from "cloudflare:node";

const server = http.createServer((req, res) => {
	res.end("hello world");
});

// Pass server directly (simplified) - automatically calls listen() if needed
export default httpServerHandler(server);

// Or use port-based routing for multiple servers
server.listen(8080);
export default httpServerHandler({ port: 8080 });

ハンドラーは、受信した Worker リクエストを Node.js サーバーへ自動でルーティングします。ポートベースのルーティングでは、ポート番号がどのサーバーがリクエストを処理するかを決めるルーティングキーになり、同じ Worker 内で複数のサーバーを共存できます。

handleAsNodeRequest

リクエストのルーティングをより直接制御したい場合は、cloudflare:nodehandleAsNodeRequest 関数を使えます。この関数は、Worker リクエストを特定のポートで動く Node.js サーバーへ直接ルーティングします。

import { createServer } from "node:http";
import { handleAsNodeRequest } from "cloudflare:node";

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

server.listen(8080);

export default {
	fetch(request) {
		return handleAsNodeRequest(8080, request);
	},
};

この方法では、fetch ハンドラーを完全に制御しつつ、リクエスト処理には Node.js HTTP サーバーを使えます。

Server

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

Server クラスは HTTP サーバーを表し、受信リクエストを処理するメソッドを提供します。Node.js の EventEmitter クラスを拡張し、独自のサーバー実装を作成できます。

httpServerHandler を使うとき、server.listen() に指定するポート番号は実際のネットワークポートではなく、ルーティングキーとして働きます。ハンドラーはこのポートで、どの HTTP サーバーインスタンスが受信リクエストを処理するかを決めます。識別に異なるポート番号を使えば、同じ Worker 内で複数のサーバーを共存できます。ポート値に 0(または null または undefined)を使うと、ランダムなポート番号が割り当てられます。

import { Server } from "node:http";
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 HTTP Server!" }));
});

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

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

  • closeAllConnections()closeIdleConnections() などの接続管理メソッドは実装されていません
  • ポート番号あり、またはパラメーターなしの listen() バリエーションだけをサポートします。listen()listen(0, callback)listen(callback) などです。詳細は Node.js ドキュメント を参照してください。
  • 次のサーバーオプションはサポートしません。maxHeaderSizeinsecureHTTPParserkeepAliveTimeoutconnectionsCheckingInterval

ServerResponse

Node.js の http.ServerResponse クラスの実装です。

ServerResponse クラスは、リクエストハンドラーに渡されるサーバー側のレスポンスオブジェクトを表します。レスポンスヘッダーと本体データの書き込み用メソッドを提供し、Node.js の Writable ストリームクラスを拡張します。

import { createServer, ServerResponse } from "node:http";
import { httpServerHandler } from "cloudflare:node";
import { ok } from "node:assert";

const server = createServer((req, res) => {
	ok(res instanceof ServerResponse);

	// Set multiple headers at once
	res.writeHead(200, {
		"Content-Type": "application/json",
		"X-Custom-Header": "Workers-HTTP",
	});

	// Stream response data
	res.write('{"data": [');
	res.write('{"id": 1, "name": "Item 1"},');
	res.write('{"id": 2, "name": "Item 2"}');
	res.write("]}");

	// End the response
	res.end();
});

export default httpServerHandler(server);

Workers の実装では、次のメソッドと機能はサポートしません。

  • assignSocket()detachSocket() メソッドは使えません
  • Trailer ヘッダーはサポートしません
  • writeContinue()writeEarlyHints() メソッドは使えません
  • 1xx レスポンス全般はサポートしません

node:http における Node.js と Workers 実装のその他の違い

Workers の node:http 実装はグローバルな fetch API のラッパーであるため、標準の Node.js 環境と比べて動作と制限に違いがあります。

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

役に立ちましたか?