You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Node.js后端通过Stream.io发送系统消息?

解决Stream.io后端发送系统消息的问题

核心问题分析

你遇到的报错本质是:后端操作Channel时需要明确身份(要么关联用户,要么用匿名身份),但服务端不能用connectUser(会影响计费),所以得用匿名连接或者指定系统用户ID的方式来发送系统消息。

正确实现代码

首先确保你的服务端客户端用API密钥 + Secret密钥正确初始化,然后通过connectAnonymousUser建立匿名身份(不会影响MAU和并发计费),再创建Channel并发送系统消息:

// 正确初始化服务端客户端:第一个是API Key,第二个是Secret Key
const serverClient = StreamChat.getInstance('YOUR_API_KEY', 'YOUR_SECRET_KEY');

// 服务端用匿名连接,不会产生计费影响
await serverClient.connectAnonymousUser();

// 创建或获取目标Channel
const streamChannel = serverClient.channel('livestream', roomId);

// 发送系统消息:指定type为"system",user_id设为系统标识
const { message } = await streamChannel.sendMessage({
  user_id: 'system_user',
  text: `${user?.username} joined the room`,
  type: 'system'
});

关键注意事项

  • 初始化客户端时必须用Secret Key:你之前的代码里第二个参数重复用了API Key,这会导致权限验证失败,一定要替换成你的Stream后台的Secret Key。
  • 服务端用connectAnonymousUser而非connectUser:这个方法不会计入MAU和并发连接数,符合服务端操作的要求。
  • 消息必须指定type: "system":这样Stream会将其识别为系统消息,区别于普通用户消息。

另一种方案:直接使用系统用户ID(无需连接)

如果你的系统中已经创建了固定的系统用户,也可以不用匿名连接,而是直接在发送消息时指定该用户的ID,同时确保服务端客户端有权限操作:

const serverClient = StreamChat.getInstance('YOUR_API_KEY', 'YOUR_SECRET_KEY');

const streamChannel = serverClient.channel('livestream', roomId);

const { message } = await streamChannel.sendMessage({
  user_id: 'your_predefined_system_user_id',
  text: `${user?.username} joined the room`,
  type: 'system'
});

这种方式需要确保your_predefined_system_user_id是已经在Stream中创建过的用户,否则可能会出现身份验证问题。

内容的提问来源于stack exchange,提问作者James Lee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 22:47:10