光环标志
光环基地文档
文档›指南›Realtime and presence (SDK)

使用 JavaScript SDK 发送实时消息和状态

aura.realtime的日常流程,以及针对正在运行的堆栈观察到的每个调用的行为。

7分钟 读取·级别 中间·修改于 2026年10月12日
该英文文本是根据法文原文自动生成的,尚未经过审查。
自此翻译以来,英文来源已发生变化。某些信息可能已过时。
该页面已自动翻译。英文版具有权威性。
#
渠道

1. 通道及其状态

通道是一个已命名的房间。打开相同名称的客户端会收到彼此的消息。当您订阅时,客户端会自行连接。

channel.tstypescript
const room = aura.realtime.channel('room-1')

room.subscribe((status) => {
  // “已订阅”| 'CHANNEL_ERROR'| '超时'| “关闭”
  if (status === 'SUBSCRIBED') console.log('ready')
})

仅在 SUBSCRIBED之后发送。在此之前或拒绝之后,send() 返回诸如 not_connected 或 requires_subscription 之类的状态,而不是发送。频道的范围仅限于您的项目:两个项目可以使用相同的名称而不会互相看到。

#
广播

2. 广播消息

broadcast.tstypescript
// 接收
room.on('broadcast', { event: 'ping' }, (message) => {
  console.log(message.payload) // { 事件:'ping',n:1,文本:'你好'}
})

// 订阅后发送
const status = await room.send({ type: 'broadcast', event: 'ping', payload: { n: 1, text: 'hello' } })
// →“好的”

在实际运行中,第二个登录的客户端在不到两秒的时间内收到了该消息。

有效负载携带 event 密钥

你收到的消息中,事件名会被添加到 payload:{ "event": "ping", "n": 1, … }。自带 event 键的 payload 会被拒绝(channel.send 返回 'invalid_payload',httpBroadcast 返回 realtime_payload_event_reserved):请重命名该键,例如 kind。

  • 默认情况下您不会收到自己的消息。 使用 { config: { broadcast: { self: true } } } 打开通道来接收它们。
  • 消息携带 id、 topic、 timestamp、 event 和 payload。
#
存在感

3. 存在

状态显示谁连接到频道,以及您选择的状态。

presence.tstypescript
const lobby = aura.realtime.channel('lobby', { config: { presence: { key: user.id } } })

lobby.on('presence', { event: 'sync' }, () => {
  console.log(lobby.presenceState())
})
lobby.subscribe(async (status) => {
  if (status === 'SUBSCRIBED') await lobby.track({ name: 'Bob' })
})

presenceState() 由用户 ID 键入。每个条目都列出了用户的连接:

presenceState()json
{
  "d6ba3994-…": [
    { "client_id": "936cb015-…", "user_id": "d6ba3994-…", "metadata": { "name": "Bob" },
      "joined_at": "2026-10-12T19:32:19.093Z", "last_seen": "2026-10-12T19:32:19.096Z" }
  ]
}

untrack() 将您从列表中删除,离开频道或关闭页面会为您完成此操作。

#
变化

4. 数据库变更

拥有独立数据库的项目

postgres_changes 适用于拥有独立数据库的项目。请先启用每张表:PUT /v1/db/{project_id}/schema/tables/{table}/realtime,请求体为 {"enabled": true},并使用 service_role 密钥。第一个客户端订阅时开始监听,最后一个客户端离开几分钟后停止。投递语义为至少一次:服务器重启后,同一变更可能到达两次,因此请让处理函数保持幂等,例如以行的主键为依据。繁忙的集群可能以容量错误拒绝新的监听;请稍后重试。 请按表命名频道,即 db:public.<table>:变更会发布到该频道。第一个订阅者可能会收到订阅前最多 5 秒内的变更。变更会保留一小时用于恢复,然后删除。集群已满时,订阅会以 capacité d'écoute postgres_changes atteinte pour la base de ce projet, réessayez 失败。如果监听中断超过一分钟,频道会进入 CHANNEL_ERROR;恢复后请重新订阅。中断时间超过一小时保留期时,期间的变更会丢失。

changes.tstypescript
const changes = aura.realtime
  .channel('db:public.todos')
  .on('postgres_changes', { event: '*', schema: 'public', table: 'todos' }, (payload) => {
    console.log(payload.eventType, payload.new)
  })
  .subscribe((status) => {
    if (status === 'CHANNEL_ERROR') console.warn('database changes are not available for this project')
  })
#
清理

5. 清理

cleanup.tstypescript
room.unsubscribe()                 // 留下一个频道
aura.realtime.removeChannel(room)  // 离开并忘记它
aura.realtime.removeAllChannels()  // 离开每个频道
aura.realtime.disconnect()         // 关闭连接

观察与 aura.realtime.onStateChange(callback) 和 onError(callback)的连接。断开连接后,客户端会自行重新连接,除非您调用 setAutoReconnect(false)。

最后更新· 2026年10月12日