uniCloud.database()需启用云开发、关联云空间并在manifest.json配置,H5需设"useUniCloud":true;where查条件、doc查单条、get执行;权限需在schema.json设置并上传;云函数支持事务、聚合等高级功能且权限独立。
uniCloud.database() 怎么调用才不会报错
直接在前端页面里写 unicloud.database() 是合法的,但必须确保项目已启用云开发、关联了云服务空间,且当前环境支持前端直连(如微信小程序、app、h5 通过 https 网关)。常见错误是控制台报 unicloud is not defined 或 database is not a function——本质是没开启云空间或未在 manifest.json 中配置云服务地址。
- 检查
unicloud目录是否存在,且右键「关联云服务空间」成功(HBuilderX 底部状态栏应显示云空间 ID) - 确认
manifest.json → uniCloud节点已启用,并选择了正确的云服务商(阿里云/腾讯云) - H5 端需额外配置
"h5": { "useUniCloud": true },否则前端直连被禁用 - 云函数里不能用
uniCloud.database()前端写法,要用const db = uniCloud.database({ provider: 'aliyun' })显式指定 provider
where / doc / get 这三个方法怎么组合才查得准
where 用于条件查询,doc 用于按 _id 精确查单条,get 是触发执行的“扳机”。三者不能混用顺序:比如先 doc(id).where(...) 会报错,因为 doc() 返回的是文档引用,不支持链式 where。
- 查所有匹配项:
db.collection('users').where({ status: 'active' }).get() - 查单条(推荐用
doc):db.collection('users').doc('xxx_id').get(),比where({_id: 'xxx_id'}).get().then(res => res.result.data[0])更快更安全 - 查多条但只取第一条:
db.collection('users').where({ type: 'vip' }).limit(1).get(),避免全量拉取再截断 - 注意
where中字段名必须和数据库实际字段完全一致(大小写敏感),且不能查未建立索引的字段(如 text 类型字段默认无索引,where({ desc: /xxx/ })可能超时)
add / update / remove 为什么总提示 permission denied
不是代码写错了,而是表级权限没开。uniCloud 默认所有操作权限为 false,哪怕你在 Web 控制台建表时勾选了“初始化权限”,也可能因本地 schema 文件未同步而失效。
- 打开
uniCloud-aliyun/database/xxx.schema.json,确认"permission"节点中对应操作为true,例如:"update": true - 改完后必须右键该文件 → 「上传 DB Schema」,仅保存文件不生效
- 若用云函数操作数据库,权限由云函数运行身份决定(即服务空间身份),不受前端权限限制——这是绕过前端权限限制的常用方式,但要注意安全边界
- 删除操作慎用
remove(),它不走权限校验(旧版 SDK 存在漏洞),建议统一用doc(id).remove()或云函数封装
云函数里操作数据库和前端直连有啥实质区别
核心差异在执行环境、权限模型和调试成本。前端直连快但受限于权限与网络策略;云函数慢一点但可控、可加日志、可跨集合 join、可做事务——尤其涉及多步写入(如扣库存+写订单+发通知)时,必须用云函数。
- 前端直连无法使用
db.command.aggregate()聚合管道,也不能调用db.collection('a').watch()实时监听 - 云函数里可用
db.startTransaction()开启事务,前端不支持 - 云函数参数 event 是客户端传入的原始数据,**不做校验就直接写库等于裸奔**,务必对
event.id、event.data做类型和范围校验 - 云函数默认超时 10 秒,复杂查询建议加
.field({})投影精简返回字段,避免大数据量序列化拖垮响应










