云对象入口文件必须是index.obj.js,导出类实例,每次调用新建实例;constructor需同步执行,不可含await;方法签名须为async methodName(event, context),参数仅来自event.data和context;不自动注入userInfo,需手动校验token。

云对象的入口文件必须是 index.obj.js
云对象不是普通云函数,它本质是服务端可复用的类实例,uniCloud 会自动将 index.obj.js 导出的对象注册为一个“类”,每次调用时创建新实例。写成 index.js 或 main.js 都不会被识别为云对象,部署后调用直接报 Function not found。
常见错误现象:
– 在 HBuilderX 右键新建云函数,误选“云函数”而非“云对象”
– 手动新建文件但命名错误,比如 user.obj.js(必须是 index.obj.js)
– 文件放在了 cloudfunctions/xxx/ 下,但目录名含大写字母或特殊符号(如 UserAPI),导致部分平台(尤其阿里云)加载失败
- 目录结构必须为:
uniCloud/cloudfunctions/my-user-service/index.obj.js - 文件开头无需
'use strict',但建议加;导出必须是module.exports = class MyUserService { ... }形式 - 类名(如
MyUserService)不参与路由匹配,仅用于调试和日志,但应与目录名语义一致
constructor 里不能写异步初始化逻辑
云对象实例在每次请求时创建,constructor 同步执行。如果你在里面 await 数据库连接、读配置或拉取 token,会阻塞实例化,导致超时或 Cannot read property 'xxx' of undefined 错误——因为后续方法调用时,异步操作还没完成。
正确做法是把耗时操作移到具体方法中,或使用懒加载模式:
- 数据库操作统一放在方法内,例如
async getUser(id)中调用db.collection('user').doc(id).get() - 若需共享连接或 client 实例(如 Redis 客户端),可在 constructor 中同步初始化基础配置,但不要 await
- 配置项推荐从
uniCloud.getConfiguration()同步读取,它不返回 Promise
方法必须是 async,且参数只能来自 event 和 context
云对象的方法签名固定为 async methodName(event, context),不能额外加参数,也不能解构 event 外部传参。前端调用时所有数据都走 event.data,别试图用 arguments[2] 或闭包传参。
容易踩的坑:
– 把 event 当成 Express 的 req,去取 event.query 或 event.body(不存在)
– 在方法里写 const { userId } = event,结果是 undefined,正确写法是 const { userId } = event.data || {}
– 返回值里包含 Date、Buffer、function 等不可序列化类型,导致响应为空或报错 Converting circular structure to JSON
- 必须显式 return 一个纯 JSON 可序列化对象,如
{ code: 0, data: user } -
context包含envId、requestId、CLIENTIP等只读字段,可用于日志或风控,但不能修改 - 如果方法不需要客户端数据,也得保留
event参数占位,否则运行时报错
云对象不支持 uni-id 自动注入 event.userInfo
这是和普通云函数的关键差异:云对象默认不会解析登录态,event.userInfo 始终为 undefined,即使你已在 uniCloud.init 开启了 login。想获取用户身份,必须手动校验 token。
典型场景是需要鉴权的接口,比如修改个人资料:
- 前端调用时需主动传 token:
uniCloud.callObject({ name: 'user', action: 'updateProfile', data: { token, profile } }) - 云对象内用
uniCloud.database().collection('__uni_user')或uniID.checkToken(token)(需引入uni-id-common)做校验 - 千万别依赖
event.userInfo.uid,那只是普通云函数的便利机制,云对象里不存在
复杂点在于 token 校验本身可能跨服务(比如用腾讯云的 token 去验阿里云环境),这种情况下要特别注意 uni-id 的 provider 配置是否匹配当前云服务商,否则 checkToken 会静默失败。











