要使用 HTTPS 客户端方法(https.get、https.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.createServer、https.Server、https.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"]Node.js `https.get' ↗ 方法的实现。
get 方法向指定 URL 执行 GET 请求并调用回调处理响应。这是便捷方法,可简化 HTTPS GET 请求,无需手动配置请求选项。
由于 get 是 fetch(...) 的封装,它只能在导出的 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 处理器中使用 Promise 正确等待请求,否则处理器返回时 fetch 可能被过早取消。
Node.js `https.request' ↗ 方法的实现。
request 方法创建 HTTPS 请求,可自定义 method、headers 和 body 等选项。它提供对请求配置的完全控制,并返回 Node.js stream.Writable 用于发送请求数据。
由于 get 是 fetch(...) 的封装,它只能在导出的 fetch 或类似处理器内使用。在此类处理器之外使用 get 会抛出错误。
request 方法接受 http.request 的所有选项,但部分默认值不同:
protocol:默认https:port:默认443agent:默认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;
},
};不支持以下额外选项:ca、cert、ciphers、clientCertEngine(已弃用)、crl、dhparam、ecdhCurve、honorCipherOrder、key、passphrase、pfx、rejectUnauthorized、secureOptions、secureProtocol、servername、sessionIdContext、highWaterMark。
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 服务器模式的同时,受益于 Workers 运行时环境,包括自动扩展、边缘部署以及与其他 Cloudflare 服务的集成。
Node.js https.Agent ↗ 类的实现。
Agent ↗ 通过为每个 host/port 维护请求队列来管理 HTTPS 连接复用。然而在 Workers 环境中,此类网络连接、端口等的底层管理并不相关,因为由 Cloudflare 基础设施处理。因此,Workers 中的 Agent 实现是桩实现,不支持连接池或 keep-alive。
Node.js https.Server ↗ 类的实现。
在 Node.js 中,https.Server 类表示 HTTPS 服务器,提供处理传入安全请求的方法。在 Workers 中,安全请求的处理由 Cloudflare 基础设施提供,因此使用 https.Server 或 http.Server 差别不大。Workers 运行时提供了完整实现,但大多数 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 之间存在以下差异:
- 由于 Workers 环境的特性,未实现
closeAllConnections()和closeIdleConnections()等连接管理方法 - 仅支持带端口号或无参数的
listen()变体:listen()、listen(0, callback)、listen(callback)等 - 不支持以下服务器选项:
maxHeaderSize、insecureHTTPParser、keepAliveTimeout、connectionsCheckingInterval - 在 Workers 环境中不支持 TLS/SSL 特定选项,如
ca、cert、key、pfx、rejectUnauthorized、secureProtocol。若需使用 mTLS,请使用 mTLS 绑定(binding)。
由于 Workers 的 node:https 实现是对全局 fetch API 的封装,与 Node.js 相比存在行为差异:
- 不使用
Connection头。Workers 将自动管理连接。 Content-Length头的处理方式与fetchAPI 相同。若提供了 body,头将自动设置,手动设置的值将被忽略。- 不支持
Expect: 100-continue头。 - 不支持 trailing 头。
- 不支持
'continue'事件。 - 不支持
'information'事件。 - 不支持
'socket'事件。 - 不支持
'upgrade'事件。 - 不支持直接访问底层
socket。 - 不支持配置 TLS 特定选项,如
ca、cert、key、rejectUnauthorized等。