云对象是将多个相关逻辑封装成可复用对象,如user云对象含get/update/delete方法;需用HBuilderX新建、保持index.obj.js命名、目录名即对象名;调用用uniCloud.callObj更简洁,并支持_before/_after拦截器。

云对象和普通云函数到底差在哪
云对象不是“另一种云函数”,而是把多个相关逻辑封装成一个可复用的对象。比如用户管理,传统方式要建 getUserInfo、updateUserInfo、deleteUser 三个云函数;云对象里就写一个 user 云对象,里面定义 get、update、delete 方法。调用时用 uniCloud.callFunction 或 uniCloud.callObj(后者更推荐),结构更清晰,代码复用率更高。
创建云对象时必须注意的三件事
在 HBuilderX 的 uniCloud/cloudfunctions 目录右键 → “新建云函数/云对象” → 选“云对象”。它会自动生成两个文件:index.obj.js 和 package.json。别手动新建 JS 文件或改名——index.obj.js 是硬编码入口,写成 index.js 就不会被识别为云对象。
- 目录名就是云对象名,比如
cloudfunctions/user→ 调用时name: 'user',大小写敏感 -
module.exports必须是对象,不能是函数;方法名不能以_开头(那是保留字,如_before) - 云对象不支持
exports.main写法,否则部署后调用报错function not found
前端调用云对象比调云函数更简单
云对象默认提供 uniCloud.callObj 方法,语义更明确、参数更少。不需要再拼 data 包一层,直接传方法名和参数:
uniCloud.callObj({
name: 'user',
method: 'get',
data: { id: 'u123' }
}).then(res => {
console.log(res.result) // 注意仍是 res.result
})
而普通云函数只能走 uniCloud.callFunction,且必须把方法名塞进 data 里模拟路由,容易出错。另外,云对象的 _before 和 _after 拦截器能统一处理登录校验、日志埋点、耗时统计,不用每个函数重复写。
云对象里访问数据库和 uni-id 的写法没变,但上下文更稳
云对象中获取数据库、调用 uniID 等 API 的方式和普通云函数完全一致,比如 const db = uniCloud.database()、const uniID = uniCloud.getUniID()。但关键区别在于:this 指向当前云对象实例,所以可以在 _before 里存 this.userId = this.getUniIdToken()?.uid,后续所有方法都能直接用 this.userId,不用反复从 event 解构。
容易忽略的一点:云对象方法返回值仍需是纯 JSON 可序列化对象。如果 return 了 new Date() 或 Buffer,结果会变成 null,且控制台无明显报错,只在日志里看到 result is null —— 这个坑比普通云函数更隐蔽,因为看起来像逻辑没执行到。











