云函数间可直接通过unicloud.callfunction调用,无需配置http地址或域名,走内网rpc通信;name为函数名(大小写敏感),data传入event.data,返回值取res.result。

云函数之间能直接调用,不需要额外配置 HTTP 地址或域名,uniCloud.callFunction 在云函数内部和前端用法完全一致。
云函数里调另一个云函数:写法和前端一模一样
你在 A 函数里想调用 B 函数,就直接用 uniCloud.callFunction,传 name 和 data 即可。不用改 host、不用配 token、不走外网——这是 uniCloud 内部 RPC 调用,走服务端内网通信。
-
name必须是目标云函数的真实名称(大小写敏感,不能带路径) -
data是普通对象,会被序列化后传给目标函数的event.data - 返回值结构统一:
res.result是目标函数return的内容,不是res.data - 如果目标函数抛出异常或返回非 JSON 可序列化值(如
Date、Buffer、function),res.result会变成null或报错
示例(A 函数中调用 B 函数):
exports.main = async (event, context) => {
try {
const res = await uniCloud.callFunction({
name: 'userProfile', // 注意:不是 'functions/userProfile',就是函数名本身
data: { userId: event.userId }
})
return { profile: res.result } // 注意取 res.result,不是 res.data
} catch (err) {
console.error('调用失败', err)
throw err
}
}
event.data vs event.body:别拿错参数来源
云函数入口接收的是 event 对象,不是 Express 的 req。很多开发者在被调用函数里写 event.body 或 event.queryStringParameters,结果是 undefined ——因为 uniCloud 云函数没有这些字段。
- 前端或其它云函数传来的数据,全在
event.data里 - 用户登录信息(如
openid、uid)在event.userInfo,前提是初始化时启用了login -
event.uniIdToken仅当项目接入uni-id且用户已登录才存在 - 不要试图用
JSON.parse(event.body),它根本不存在
跨函数调用的权限与网络限制
虽然调用本身无需鉴权,但实际运行时受两个硬性约束:
- 阿里云/腾讯云环境默认禁止云函数主动访问外网(
require('http')、fetch、https.request等都会失败),但uniCloud.callFunction不受影响——它是平台级内网调用,不受出方向白名单限制 - 若被调用函数依赖云数据库或云存储,需确保其权限规则(schema)允许当前调用方(即调用它的那个函数)读写,否则查不到数据或写入被拒
- 函数间调用也计入调用次数配额,高频嵌套(A→B→C→A)容易触发限频,建议控制调用深度 ≤3 层
错误排查:requestId 和日志必须配合看
云函数调用链路出问题时,单看错误堆栈往往不够。关键线索在 requestId 字段:
- 每次
uniCloud.callFunction返回的res.requestId是唯一标识,和被调用函数日志里的requestId完全一致 - HBuilderX 本地调试不返回
header和完整requestId,必须部署到云端后,在 uniCloud 控制台「云函数日志」里按requestId过滤,才能看到完整上下文 - 常见静默失败场景:被调函数
return undefined、throw new Error()未被捕获、或返回了Map/Set等不可序列化对象 → 都会导致调用方收到res.result === null且无明显报错
跨函数调用看着简单,真正卡住人的往往是 event.data 拿不到、res.result 是 null、或者日志里找不到对应 requestId ——这些问题基本都出在参数结构误判、返回值类型越界、或没切到真实云端环境查日志。











