跳转到内容
搜索文档

Durable Object Stub

最后更新 查看 MarkdownAgent 设置

描述

DurableObjectStub 接口是用于调用远程 Durable Object 方法的客户端。DurableObjectStub 的类型是泛型的,以允许在 stub 上调用 RPC 方法。

Durable Objects 实现 E-order 语义,这一概念源自 E 分布式编程语言。当您对同一 Durable Object 进行多次调用时,保证调用按您发起的顺序传递给远程 Durable Object。E-order 语义使许多分布式编程问题更容易解决。E-order 由 Cloudflare Workers 用于内部通信的 Cap'n Proto 分布式对象能力 RPC 协议实现。

如果 Durable Object stub 抛出异常,所有进行中的调用和未来调用都将因异常而失败。要继续调用远程 Durable Object 的方法,Worker 必须重新创建 stub。不同 stub 之间没有顺序保证。

import { DurableObject } from "cloudflare:workers";

// Durable Object
export class MyDurableObject extends DurableObject {
	constructor(ctx, env) {
		super(ctx, env);
	}

	async sayHello() {
		return "Hello, World!";
	}
}

// Worker
export default {
	async fetch(request, env) {
		// stub 是用于调用 Durable Object 上方法的客户端
		const stub = env.MY_DURABLE_OBJECT.getByName("foo");

		// Durable Object 上的方法是通过 stub 调用的
		const rpcResponse = await stub.sayHello();

		return new Response(rpcResponse);
	},
};
import { DurableObject } from "cloudflare:workers";

export interface Env {
	MY_DURABLE_OBJECT: DurableObjectNamespace<MyDurableObject>;
}

// Durable Object
export class MyDurableObject extends DurableObject {
	constructor(ctx: DurableObjectState, env: Env) {
		super(ctx, env);
	}

	async sayHello(): Promise<string> {
		return "Hello, World!";
	}
}

// Worker
export default {
	async fetch(request, env) {
		// stub 是用于调用 Durable Object 上方法的客户端
		const stub = env.MY_DURABLE_OBJECT.getByName("foo");

		// Durable Object 上的方法是通过 stub 调用的
		const rpcResponse = await stub.sayHello();

		return new Response(rpcResponse);
	},
} satisfies ExportedHandler<Env>;

属性

id

idDurableObjectStub 的属性,对应于用于创建 stub 的 DurableObjectId

const id = env.MY_DURABLE_OBJECT.newUniqueId();
const stub = env.MY_DURABLE_OBJECT.get(id);
console.assert(id.equals(stub.id), "This should always be true");
id = env.MY_DURABLE_OBJECT.newUniqueId()
stub = env.MY_DURABLE_OBJECT.get(id)
assert id.equals(stub.id), "This should always be true"

name

nameDurableObjectStub 的可选属性,如果在创建 stub 时提供了名称(直接通过 DurableObjectNamespace::getByName 或间接通过 DurableObjectNamespace::idFromName 创建的 DurableObjectId),则返回该名称。如果用于创建 DurableObjectStubDurableObjectId 是使用 DurableObjectNamespace::newUniqueId 构造的,则此值为 undefined。

const stub = env.MY_DURABLE_OBJECT.getByName("foo");
console.assert(stub.name === "foo", "This should always be true");
stub = env.MY_DURABLE_OBJECT.getByName("foo")
assert stub.name == "foo", "This should always be true"

相关资源

这篇文档对您有帮助吗?