如何用Node.js生成适配agora-rn-uikit的Agora临时RTC Token
解决方案:生成适配agora-rn-uikit的Agora RTC Token
1. 明确Agora控制台临时Token的特性
控制台生成的临时Token默认遵循以下规则:
- 基于UID生成(而非用户账号)
- UID设为
0(允许客户端自动获取临时UID) - 角色为
publisher(拥有发布和订阅流的权限) - 默认有效期24小时
2. 调整Node.js服务器代码
修改生成逻辑,匹配控制台的Token规则,同时支持客户端动态获取对应UID的Token:
const express = require("express"); const { RtcTokenBuilder, RtcRole } = require("agora-access-token"); require("dotenv/config"); const app = express(); const nocache = (_, resp, next) => { resp.header("Cache-Control", "private, no-cache, no-store, must-revalidate"); resp.header("Expires", "-1"); resp.header("Pragma", "no-cache"); next(); }; const generateRTCToken = (req, resp) => { resp.header("Access-Control-Allow-Origin", "*"); const channelName = req.params.channel; if (!channelName) { return resp.status(500).json({ error: "channel is required" }); } // 支持UID为0(控制台默认逻辑),也支持自定义UID let uid = req.params.uid ? parseInt(req.params.uid, 10) : 0; // 固定设为publisher(和控制台一致,确保拥有发布订阅权限) const role = RtcRole.PUBLISHER; // 默认有效期3600秒,可通过query参数调整 let expireTime = req.query.expiry ? parseInt(req.query.expiry, 10) : 3600; const currentTime = Math.floor(Date.now() / 1000); const privilegeExpireTime = currentTime + expireTime; // 用UID生成Token(和控制台逻辑一致) const token = RtcTokenBuilder.buildTokenWithUid( process.env.APP_ID, process.env.APP_CERTIFICATE, channelName, uid, role, privilegeExpireTime ); return resp.json({ rtcToken: token, channel: channelName, uid }); }; // 简化路由:支持传入频道和可选UID,默认UID为0 app.get("/rtc/:channel/:uid?", nocache, generateRTCToken); app.listen(process.env.PORT, () => { console.log(`Listening on port: ${process.env.PORT}`); });
3. 调整React Native客户端代码
确保客户端使用的UID和生成Token的UID一致,或者使用UID=0让Agora自动分配:
场景1:自动分配UID(和控制台完全一致)
const App = () => { const [videoCall, setVideoCall] = useState(true); const [rtcToken, setRtcToken] = useState(""); // 初始化时从服务器获取Token(UID=0) useEffect(() => { fetch(`http://你的服务器地址/rtc/test`) // 频道名test,UID默认0 .then(res => res.json()) .then(data => setRtcToken(data.rtcToken)); }, []); const connectionData = { appId: '<你的Agora App ID>', channel: 'test', rtcToken: rtcToken, // 不指定rtcUid,或设为0,Agora会自动分配临时UID }; const rtcCallbacks = { EndCall: () => setVideoCall(false), }; return videoCall ? ( rtcToken ? <AgoraUIKit connectionData={connectionData} rtcCallbacks={rtcCallbacks} /> : <Text>Loading...</Text> ) : ( <Text onPress={()=>setVideoCall(true)}>Start Call</Text> ); };
场景2:使用自定义UID(避免冲突)
如果需要指定固定UID,确保每个客户端的UID唯一,并且获取Token时传入该UID:
// 客户端示例:UID设为12345 useEffect(() => { fetch(`http://你的服务器地址/rtc/test/12345`) // 传入UID=12345 .then(res => res.json()) .then(data => setRtcToken(data.rtcToken)); }, []); const connectionData = { appId: '<你的Agora App ID>', channel: 'test', rtcToken: rtcToken, rtcUid: 12345 // 和请求Token时的UID一致 };
关键注意事项
- Token参数一致性:生成Token时的
appId、channelName、uid必须和客户端传入AgoraUIKit的完全一致,否则会报110错误。 - UID唯一性:多个客户端不能使用同一个UID加入同一频道,否则会导致远端流无法显示。
- 权限设置:必须使用
RtcRole.PUBLISHER角色,否则客户端无法发布或订阅流。 - 环境变量验证:确保服务器的
APP_ID和APP_CERTIFICATE和控制台的完全一致,没有拼写错误。
内容的提问来源于stack exchange,提问作者Ahmed Al Sawy
相关产品推荐
相关产品推荐

