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
相关产品推荐
相关产品推荐

