跳转到内容
搜索文档

https

最后更新 查看 MarkdownAgent 设置

兼容性标志

客户端方法

要使用 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 处理器中使用 Promise 正确等待请求,否则处理器返回时 fetch 可能被过早取消。

request

Node.js `https.request' 方法的实现。

request 方法创建 HTTPS 请求,可自定义 method、headers 和 body 等选项。它提供对请求配置的完全控制,并返回 Node.js stream.Writable 用于发送请求数据。

由于 getfetch(...) 的封装,它只能在导出的 fetch 或类似处理器内使用。在此类处理器之外使用 get 会抛出错误。

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 服务器模式的同时,受益于 Workers 运行时环境,包括自动扩展、边缘部署以及与其他 Cloudflare 服务的集成。

Agent

Node.js https.Agent 类的实现。

Agent 通过为每个 host/port 维护请求队列来管理 HTTPS 连接复用。然而在 Workers 环境中,此类网络连接、端口等的底层管理并不相关,因为由 Cloudflare 基础设施处理。因此,Workers 中的 Agent 实现是桩实现,不支持连接池或 keep-alive。

Server

Node.js https.Server 类的实现。

在 Node.js 中,https.Server 类表示 HTTPS 服务器,提供处理传入安全请求的方法。在 Workers 中,安全请求的处理由 Cloudflare 基础设施提供,因此使用 https.Serverhttp.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)
  • 不支持以下服务器选项:maxHeaderSizeinsecureHTTPParserkeepAliveTimeoutconnectionsCheckingInterval
  • 在 Workers 环境中不支持 TLS/SSL 特定选项,如 cacertkeypfxrejectUnauthorizedsecureProtocol。若需使用 mTLS,请使用 mTLS 绑定(binding)

Node.js 与 Workers node:https 实现的其他差异

由于 Workers 的 node:https 实现是对全局 fetch API 的封装,与 Node.js 相比存在行为差异:

  • 不使用 Connection 头。Workers 将自动管理连接。
  • Content-Length 头的处理方式与 fetch API 相同。若提供了 body,头将自动设置,手动设置的值将被忽略。
  • 不支持 Expect: 100-continue 头。
  • 不支持 trailing 头。
  • 不支持 'continue' 事件。
  • 不支持 'information' 事件。
  • 不支持 'socket' 事件。
  • 不支持 'upgrade' 事件。
  • 不支持直接访问底层 socket
  • 不支持配置 TLS 特定选项,如 cacertkeyrejectUnauthorized 等。

这篇文档对您有帮助吗?