跳至主要内容

API 参考

此页面上的 Pulse API 参考文档基于以下模式

model User {
id Int @id @default(autoincrement())
name String?
email String @unique
}

stream()

stream() 返回一个 异步可迭代对象,它会接收与您调用此方法的表相关的所有数据库更改事件。

const stream = await prisma.user.stream();

由于返回的是异步可迭代对象,因此您可以使用 for await...of 循环来等待和接收事件。

for await (let event of subscription) {
console.log(event);
}

说明

  • stream() 的使用需要您在 Pulse 项目中启用 事件持久化
  • stream() 保证所有事件至少传递一次,并且按正确顺序传递。

选项

您可以将包含配置选项的对象传递给 stream()。该对象具有以下字段

名称描述
name流的名称。提供此选项可启用“可恢复性”,并确保您在流处于非活动状态时(例如,因为您的服务器已关闭)仍能接收事件。请注意,如果提供了 name,则在任何给定时间只有一个客户端可以连接到具有该特定 name 的流。
create一个对象,用于指定要接收的创建事件的过滤器。如果您将对象留空,使用 create: {},您将接收所有创建事件。您可以对模型的任何标量字段进行过滤。
update一个对象,其中包含一个 after 字段,用于指定要接收的更新事件的过滤器。如果您将对象留空,使用 update: {},您将接收所有更新事件。该过滤器应用于在执行更新后记录的值。您可以对模型的任何标量字段进行过滤。
delete一个对象,用于指定要接收的删除事件的过滤器。您可以对模型的任何标量字段进行过滤。

返回类型

在没有过滤器参数的情况下调用时,stream() 方法会返回以下类型

const stream: PulseSubscription<
| PulseCreateEvent<{
id: number;
name: string | null;
email: string;
}>
| PulseUpdateEvent<{
id: number;
name: string | null;
email: string;
}>
| PulseDeleteEvent<{
id: number;
name: string | null;
email: string;
}>
> = await prisma.user.stream();

根据您提供的参数,返回类型可能会发生变化。例如,如果您仅筛选 create 事件,类型将进行调整

const stream: PulseSubscription<
PulseCreateEvent<{
id: number;
email: string;
name: string | null;
}>
> = await prisma.user.stream({
create: {},
});

示例

使用 name 才能“恢复”流

const stream = await prisma.user.stream({
name: "all-user-events",
});

详细了解恢复流 此处

筛选 name 值不为空的新 User 记录

const stream = await prisma.user.stream({
create: {
name: { not: null },
},
});

筛选更新后 email@prisma.io 结尾的 User 记录

const stream = await prisma.user.stream({
update: {
after: {
email: { endsWith: "@prisma.io" },
},
},
});

筛选 email 包含 hello 的已删除 User 记录

const stream = await prisma.user.stream({
delete: {
email: { contains: "hello" },
},
});

subscribe()

subscribe() 返回一个 异步可迭代对象,它会接收与您调用此方法的表相关的数据库更改事件。

const subscription = await prisma.user.subscribe();

由于返回的是异步可迭代对象,因此您可以使用 for await...of 循环来等待和接收事件。

for await (let event of subscription) {
console.log(event);
}

说明

  • subscribe() 保证所有事件最多传递一次。对于事件到达的顺序没有任何保证。
  • 使用 subscribe() 传递的事件是临时的,这意味着如果您的订阅在数据库中发生事件时处于非活动状态(例如,因为您的服务器已关闭),则不会传递这些事件。

选项

您可以将包含配置选项的对象传递给 subscribe()。该对象具有以下字段

名称描述
create一个对象,用于指定要接收的创建事件的过滤器。如果您将对象留空,使用 create: {},您将接收所有创建事件。您可以对模型的任何标量字段进行过滤。
update一个对象,其中包含一个 after 字段,用于指定要接收的更新事件的过滤器。如果您将对象留空,使用 update: {},您将接收所有更新事件。该过滤器应用于在执行更新后记录的值。您可以对模型的任何标量字段进行过滤。
delete一个对象,用于指定要接收的删除事件的过滤器。您可以对模型的任何标量字段进行过滤。

返回类型

在没有过滤器参数的情况下调用时,subscribe() 方法会返回以下类型

const subscription: PulseSubscription<
| PulseCreateEvent<{
id: number;
name: string | null;
email: string;
}>
| PulseUpdateEvent<{
id: number;
name: string | null;
email: string;
}>
| PulseDeleteEvent<{
id: number;
name: string | null;
email: string;
}>
> = await prisma.user.subscribe();

根据您提供的参数,返回类型可能会发生变化。例如,如果您仅筛选 create 事件,类型将进行调整

const subscription: PulseSubscription<
PulseCreateEvent<{
id: number;
email: string;
name: string | null;
}>
> = await prisma.user.subscribe({
create: {},
});

示例

筛选 name 值不为空的新 User 记录

const subscription = await prisma.user.subscribe({
create: {
name: { not: null },
},
});

筛选更新后 email@prisma.io 结尾的 User 记录

const subscription = await prisma.user.subscribe({
update: {
after: {
email: { endsWith: "@prisma.io" },
},
},
});

筛选 email 包含 hello 的已删除 User 记录

const subscription = await prisma.user.subscribe({
delete: {
email: { contains: "hello" },
},
});

stream()subscribe() 的比较

对于大多数用例,stream() 是推荐的选项,因为它可以提供保证,确保事件到达消费者端。但是请注意,由于 stream() 需要启用事件持久化,因此这对 事件存储和成本 存在影响。

查看 更详细的比较

stop()

允许您明确停止流和订阅并关闭连接。这对于确保每个表允许的有限数量的订阅不会被耗尽是必要的。

对于 stream()

// Create the stream
const stream = await prisma.user.stream();

// ... Use the stream

// Stop the stream
stream.stop();

对于 subscribe()

// Create the subscription
const subscription = await prisma.user.subscribe();

// ... Use the subscription

// Stop the subscription
subscription.stop();

PulseCreateEvent<User>

任何在数据库中发生的 create 事件都会返回类型为 PulseCreateEvent 的对象。

类型

PulseCreateEvent 具有以下字段

名称类型示例值描述
idstring01HYBEER1JPSBVPG2NQADNQTA6遵循 ULID 规范的唯一标识符/幂等键。
modelNamestringUser受此事件影响的模型的名称。这是您 Prisma 架构中的模型名称。
actionstringcreate在数据库中执行的写入操作类型:create
createdUser请参阅以下示例中的 created一个包含刚创建的记录的值的对象。

事件的类型是您模型字段的泛型。在本例中,对于上述 User 模型,它看起来如下所示

PulseCreateEvent<{

email: string;
name: string | null;
}>;

示例

以下是一个示例

{
action: 'create',
created: { id: 3, email: '[email protected]', name: 'Jane Doe' },
id: '0/2A5A590',
modelName: 'User'
}

PulseUpdateEvent<User>

任何在数据库中发生的 delete 事件都会返回类型为 PulseUpdateEvent 的对象。

类型

PulseUpdateEvent 具有以下字段

名称类型示例值描述
idstring01HYBEER1JPSBVPG2NQADNQTA6遵循 ULID 规范的唯一标识符/幂等键。
modelNamestringUser受此事件影响的模型的名称。这是您 Prisma 架构中的模型名称。
actionstringupdate在数据库中执行的写入操作类型:update
beforeUsernull包含刚更新的记录的值的对象。这仅在数据库中的 REPLICA IDENTITY 设置为 FULL 时有效。否则,该值将始终为 null
afterUser请参阅以下示例中的 after包含刚更新的记录的值的对象。

事件的类型是您模型字段的泛型。在本例中,对于上述 User 模型,它看起来如下所示

PulseUpdateEvent<{
id: number;
email: string;
name: string | null;
}>;

示例

REPLICA IDENDITY 设置为 FULL

{
action: 'update',
after: { id: 2, email: '[email protected]', name: 'Jane Doe' },
before: null,
id: '0/2A5A248',
modelName: 'User'
}

REPLICA IDENDITY 设置为 FULL

{
action: 'update',
after: { id: 2, email: '[email protected]', name: 'Jane Doe' },
before: { id: 2, email: '[email protected]', name: null },
id: '0/2A5A248',
modelName: 'User'
}

PulseDeleteEvent<User>

タイプ

PulseDeleteEvent は、次のフィールドを持ちます。

名称类型示例值描述
idstring01HYBEER1JPSBVPG2NQADNQTA6遵循 ULID 规范的唯一标识符/幂等键。
modelNamestringUser受此事件影响的模型的名称。这是您 Prisma 架构中的模型名称。
actionstringdeleteデータベースで実行された書き込み操作の種類: createupdate、または delete
削除済みUser{ id: 3 }削除されたばかりのレコードの値を持つオブジェクト。これは、データベースの REPLICA IDENTITYFULL に設定されている場合にのみ機能します。それ以外の場合は、オブジェクトには id フィールドのみが含まれます。

事件的类型是您模型字段的泛型。在本例中,对于上述 User 模型,它看起来如下所示

PulseDeleteEvent<{
id: number;
email: string;
name: string | null;
}>;

REPLICA IDENDITY 设置为 FULL

 {
action: 'delete',
deleted: { id: 1 },
id: '0/2A5A398',
modelName: 'User'
}

REPLICA IDENDITY 设置为 FULL

 {
action: 'delete',
deleted: { id: 42, email: '[email protected]', name: 'Jane Doe' },
id: '0/2A5A398',
modelName: 'User'
}