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

React GetStream调用queryUsers报错:secret与user tokens均未设置

问题分析

报错Error: Both secret and user tokens are not set的核心原因是:调用queryUsers()时,StreamChat客户端尚未完成用户认证。queryUsers属于需要权限的API操作,哪怕项目处于开发模式关闭了认证,客户端仍需持有有效的token才能发起请求。你当前的代码逻辑是先调用queryUsers再执行connectUser,此时客户端还未获得token,自然触发认证错误。而硬编码用户对象时,connectUser先执行,客户端完成认证,后续操作就不会报错。

解决方案

调整代码执行顺序,先完成用户认证(调用connectUser),再执行queryUsers获取完整用户对象。如果需要用获取到的完整用户对象更新客户端状态,可以在queryUsers后调用updateUser方法。

修改后的代码示例:

useEffect(() => {
  async function init() {
    const chatClient = StreamChat.getInstance(apiKey);

    // 1. 先使用基础用户信息完成认证,获取token
    await chatClient.connectUser(
      { id: testUserId }, // 先传入基础用户ID即可完成认证
      chatClient.devToken(testUserId)
    );

    // 2. 认证完成后,调用queryUsers获取完整用户对象
    const response = await chatClient.queryUsers({
      id: { $in: [testUserId] },
    });
    const userObject = response.users[0];

    // 3. 可选:如果需要用完整用户对象更新客户端状态
    if (userObject) {
      await chatClient.updateUser(userObject);
    }

    const channel = chatClient.channel("messaging", "react-talk", {
      image: "https://getstream.io/random_svg/?id=john&name=John",
      name: "React Talk",
      members: [userObject.id],
    });
    await channel.watch();

    setChannel(channel);
    setClient(chatClient);
  }

  init();

  return () => {
    if (client) {
      client.disconnectUser();
    }
  };
}, []);
补充说明
  • 开发模式下使用devToken即可快速完成认证,无需复杂的签名逻辑
  • 如果不需要更新用户状态,也可以直接使用第一步传入的基础用户对象进行后续操作,跳过updateUser步骤
  • 确保testUserId是GetStream中已存在的用户ID,否则queryUsers会返回空数组

内容的提问来源于stack exchange,提问作者Sam Yoon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 11:27:40