HTTP クライアント側のメソッド(http.get、http.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.createServer、http.Server、http.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"
]Node.js の http.get ↗ メソッドの実装です。
get メソッドは指定した URL へ GET リクエストを送り、レスポンスをコールバックに渡します。リクエストオプションを手動で設定せずに HTTP GET を送れる、簡易メソッドです。
get は fetch(...) のラッパーのため、エクスポートした 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 が途中でキャンセルされることがあります。
Node.js の `http.request' ↗ メソッドの実装です。
request メソッドは、メソッド、ヘッダー、本体などを指定できる HTTP リクエストを作成します。リクエスト設定を細かく制御でき、リクエストデータを送るための Node.js stream.Writable ↗ を返します。
request は fetch(...) のラッパーのため、エクスポートした 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)に渡す次のオプションはサポートしません。
maxHeaderSizeinsecureHTTPParsercreateConnectionlookupsocketPath
OutgoingMessage ↗ クラスは、クライアントへ送る HTTP レスポンスを表します。レスポンスヘッダーと本体の書き込み、レスポンスの終了用メソッドを提供します。OutgoingMessage は Node.js の stream.Writable ストリームクラス ↗ を拡張します。
OutgoingMessage クラスは、送信 HTTP メッセージ(リクエストとレスポンスの両方)の基底クラスです。ヘッダーと本体データの書き込み、メッセージの終了用メソッドを提供します。OutgoingMessage は Writable ストリームクラス ↗ を拡張します。
ClientRequest と ServerResponse は、どちらも OutgoingMessage を拡張し、そこから継承します。
IncomingMessage クラスは、クライアントから受け取る HTTP リクエストを表します。リクエストヘッダーと本体の読み取り、リクエストの終了用メソッドを提供します。IncomingMessage は Readable ストリームクラスを拡張します。
IncomingMessage クラスは HTTP メッセージ(リクエストまたはレスポンス)を表します。ヘッダーと本体データの読み取り用メソッドを提供します。IncomingMessage は Readable ストリームクラスを拡張します。
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を拡張しません。含まれるのは次のプロパティだけです。encrypted、remoteFamily、remoteAddress、remotePort、localAddress、localPort、および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()にフォールスルーします
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:");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 });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 内で複数のサーバーを共存できます。
リクエストのルーティングをより直接制御したい場合は、cloudflare:node の handleAsNodeRequest 関数を使えます。この関数は、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 サーバーを使えます。
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 ドキュメント ↗ を参照してください。 - 次のサーバーオプションはサポートしません。
maxHeaderSize、insecureHTTPParser、keepAliveTimeout、connectionsCheckingInterval
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 レスポンス全般はサポートしません
Workers の node:http 実装はグローバルな fetch API のラッパーであるため、標準の Node.js 環境と比べて動作と制限に違いがあります。
Connectionヘッダーは使いません。接続は Workers が自動管理します。Content-Lengthヘッダーの扱いはfetchAPI と同じです。本体がある場合、ヘッダーは自動設定され、手動で設定した値は無視されます。Expect: 100-continueヘッダーはサポートしません。- Trailer ヘッダーはサポートしません。
'continue'イベントはサポートしません。'information'イベントはサポートしません。'socket'イベントはサポートしません。'upgrade'イベントはサポートしません。- 基盤の
socketへの直接アクセスはサポートしません。