跳转到内容
本站为社区维护的非官方中文翻译,与 Cloudflare, Inc. 无关联。本站不提供账户登录,请勿在任何非官方站点输入您的 Cloudflare 账户信息。官方文档:developers.cloudflare.com

Connect Handler

最后更新 查看 MarkdownAgent 设置

背景

导出 connect() handler,让 Worker 接受入站 TCP 连接,并在其上读写原始字节。该 handler 接收 Socket 对象,类型与出站连接中 cloudflare:sockets 的 connect() 返回的类型相同。

当另一个 Worker 通过 service binding 将 TCP 连接转发过来、并在该绑定上调用 connect() 时,Worker 会在其 connect() handler 中收到该连接:

// Worker A forwards a TCP connection to Worker B over a service binding
export default {
	async fetch(request, env) {
		const socket = env.BACKEND.connect("example.com:1234");
		// Read from and write to socket.readable / socket.writable
		return new Response(socket.readable);
	},
};

语法

export default {
	async connect(socket, env, ctx) {
		const writer = socket.writable.getWriter();
		await writer.write(new TextEncoder().encode("hello"));
		await writer.close();
	},
};
interface Env {}

export default {
	async connect(socket: Socket, env: Env, ctx: ExecutionContext) {
		const writer = socket.writable.getWriter();
		await writer.write(new TextEncoder().encode("hello"));
		await writer.close();
	},
} satisfies ExportedHandler<Env>;

你也可以将 connect() 实现为 WorkerEntrypoint 类上的方法,这样单个 Worker 可以在暴露其他 RPC 方法的同时暴露 connect() handler:

import { WorkerEntrypoint } from "cloudflare:workers";

export class Backend extends WorkerEntrypoint {
	async connect(socket) {
		const writer = socket.writable.getWriter();
		await writer.write(new TextEncoder().encode("hello"));
		await writer.close();
	}
}

参数

未导出 connect() handler 的 Worker 会拒绝任何转发到它的连接。

相关资源

  • TCP sockets — 创建出站 TCP 连接并使用 Socket API。
  • Service bindings — 从一个 Worker 调用另一个 Worker,包括使用 connect() 转发 TCP 连接。

这篇文档对您有帮助吗?