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

使用Firebase Cloud Function生成Agora Token时遇类型错误求助

解决Agora Token生成的参数类型错误问题

错误原因分析

你遇到的错误是因为传入Agora Token生成方法的参数不符合类型要求,核心问题包括:

  • 代码中使用了占位符"appId"和"appCertificate",未替换为真实字符串值
  • uid的赋值逻辑错误,忽略请求传入的uid参数,可能导致类型异常
  • 过期时间参数使用了绝对时间戳,而非Agora要求的相对过期秒数
  • 请求payload格式不符合JSON规范(用单引号而非双引号),导致参数解析失败

修正步骤及代码

1. 替换Agora身份信息

将代码中的"appId"和"appCertificate"替换为你在Agora控制台获取的真实App ID和App Certificate字符串。

2. 修正参数逻辑与校验

添加参数校验,修正uid和过期时间的处理逻辑:

const admin = require('firebase-admin');
const functions = require('firebase-functions');
const Agora = require("agora-access-token");
admin.initializeApp();

exports.tokenGeneration = functions.https.onRequest((request, response) => {
  // 参数校验
  if (!request.body.channelName || typeof request.body.channelName !== 'string') {
    return response.status(400).send({ error: "channelName是必填项,且必须为字符串" });
  }
  if (typeof request.body.role !== 'number' || ![0, 1].includes(request.body.role)) {
    return response.status(400).send({ error: "role必须为0(发布者)或1(订阅者)" });
  }
  if (!request.body.expireTimestamp || isNaN(parseInt(request.body.expireTimestamp))) {
    return response.status(400).send({ error: "expireTimestamp是必填项,且必须为有效数字" });
  }

  const appID = "你的真实Agora AppID"; // 替换为真实值
  const appCertificate = "你的真实Agora App Certificate"; // 替换为真实值
  const uid = parseInt(request.body.uid) || 0; // 使用请求传入的uid,默认值为0
  const role = request.body.role === 0 ? Agora.RtcRole.PUBLISHER : Agora.RtcRole.SUBSCRIBER;
  const channel = request.body.channelName;
  const expirationTimestamp = parseInt(request.body.expireTimestamp);
  
  // 将绝对时间戳转换为Agora要求的相对过期秒数
  const currentTimestamp = Math.floor(Date.now() / 1000);
  const expirationInSeconds = expirationTimestamp - currentTimestamp;
  
  if (expirationInSeconds <= 0) {
    return response.status(400).send({ error: "过期时间戳必须在未来" });
  }

  const token = Agora.RtcTokenBuilder.buildTokenWithUid(appID, appCertificate, channel, uid, role, expirationInSeconds);
  response.send({ "token" : token });
});

3. 修正请求payload格式

确保请求使用标准JSON格式(键名用双引号),并设置请求头Content-Type: application/json:

{
  "channelName": "amankachannel",
  "uid": 0,
  "role": 1,
  "expireTimestamp": "3456783476547"
}

内容的提问来源于stack exchange,提问作者Aman Mishra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 04:17:19