Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
DCloud
unidocs-zh
提交
d8891b57
unidocs-zh
项目概览
DCloud
/
unidocs-zh
通知
3172
Star
105
Fork
804
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
93
列表
看板
标记
里程碑
合并请求
67
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
unidocs-zh
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
93
Issue
93
列表
看板
标记
里程碑
合并请求
67
合并请求
67
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
d8891b57
编写于
2月 10, 2022
作者:
雪洛
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
docs: uniCloud cloud obj
上级
b26dc508
变更
1
显示空白变更内容
内联
并排
Showing
1 changed file
with
209 addition
and
0 deletion
+209
-0
docs/uniCloud/cloud-obj.md
docs/uniCloud/cloud-obj.md
+209
-0
未找到文件。
docs/uniCloud/cloud-obj.md
0 → 100644
浏览文件 @
d8891b57
## 云对象
> 新增于 HBuilderX 3.4.0
云对象本质上是对云函数的封装,和传统方式通过callFunction调用云函数相比,云对象写法更简单,调用更清晰。另外云对象默认支持
[
uniCloud响应体规范
](
uniCloud/cf-functions.md?id=resformat
)
,对于满足规范的错误响应会在客户端自动抛出错误,开发者可以少写很多罗里吧嗦的判断。
以多action云函数为例,对比一下云对象和传统云函数
**传统callFunction方式代码如下:**
```
js
// 传统方式调用云函数-云函数代码
// 云函数名:user-center
// 云函数入口index.js内容如下
'
use strict
'
;
exports
.
main
=
async
(
event
,
context
)
=>
{
const
{
action
,
params
}
=
event
switch
(
action
)
{
case
'
updateUser
'
:
{
const
{
nickname
,
age
}
=
params
// 简化演示逻辑,此处不演示token校验
if
(
!
nickname
)
{
return
{
errCode
:
'
INVALID_NICKNAME
'
,
errMsg
:
'
昵称不正确
'
}
}
return
{
errCode
:
0
,
errMsg
:
'
更新成功
'
}
}
}
return
{
errCode
:
'
ACTION_NOT_FOUND
'
,
errMsg
:
`action[action] not found`
}
};
// 传统方式调用云函数-客户端代码
async
function
updateUser
()
{
try
{
const
res
=
uniCloud
.
callFunction
({
name
:
'
user-center
'
,
data
:
{
action
:
'
updateUser
'
,
params
:
{
nickname
:
'
dc
'
,
age
:
10
}
}
})
const
{
errCode
,
errMsg
}
=
res
.
result
if
(
errCode
)
{
uni
.
showModal
({
title
:
'
更新失败
'
,
content
:
errMsg
,
showCancel
:
false
})
return
}
uni
.
showToast
({
title
:
'
更新成功
'
})
}
catch
(
e
)
{
uni
.
showModal
({
title
:
'
更新失败
'
,
content
:
e
.
message
,
showCancel
:
false
})
}
}
```
**使用云对象的写法如下:**
```
js
// 使用云对象的写法-云对象代码
// 云对象名:user-center
// 云对象入口index.obj.js内容如下
module
.
exports
=
{
updateUser
(
nickname
,
age
)
{
if
(
!
nickname
)
{
return
{
errCode
:
'
INVALID_NICKNAME
'
,
errMsg
:
'
昵称不正确
'
}
}
return
{
errCode
:
0
,
errMsg
:
'
更新成功
'
}
}
}
// 使用云对象的写法-客户端代码
const
userCenter
=
uniCloud
.
importObject
(
'
user-center
'
)
async
function
updateUser
()
{
try
{
const
res
=
await
userCenter
.
updateUser
(
'
dc
'
,
10
)
uni
.
showToast
({
title
:
'
更新成功
'
})
}
catch
(
e
)
{
// 此形式响应符合uniCloud响应体规范中的错误响应,自动抛出此错误
// {
// errCode: 'INVALID_NICKNAME',
// errMsg: '昵称不正确'
// }
uni
.
showModal
({
title
:
'
更新失败
'
,
content
:
e
.
errMsg
,
showCancel
:
false
})
}
}
```
可以看到大量的业务无关代码被简化掉,开发效率UP。此外通过
`ObjectName.ActionName`
的方式调用云函数和云端写法完全一致,心智负担大幅减小。请阅读以下内容深入了解云对象
## 规范
云对象和云函数都在cloudfunctions目录下,但是不同于云函数,云对象的入口为
`index.obj.js`
,而云函数则是
`index.js`
。
**为正确区分两者uniCloud做出了限制,云函数内不可存在index.obj.js,云对象内也不可存在index.js。**
一个标准的云对象入口应导出一个对象,如下:
对象内每个键值对是一个action
```
js
// user-center/index.obj.js
module
.
exports
=
{
updateUser
:
async
function
(
nickname
,
age
)
{
console
.
log
(
nickname
,
age
)
}
// action updateUser
}
```
云对象也可以引用公共模块或者npm上的包,引用方式和云函数完全一致。
### 客户端调用@call-by-client
客户端通过
`uniCloud.importObject`
方法获取云对象的实例。用法如下
```
js
const
userCenter
=
uniCloud
.
importObject
(
'
user-center
'
)
const
res
=
await
userCenter
.
updateUser
(
'
dc
'
,
10
)
// 传入参数 nickname 和 age,参数和云对象内的action完全一致
```
### 客户端调用返回值@return-value
客户端拿到云对象的响应结果后,会自动进行结果的处理。
-
如果是正常的结果(errCode为假值[0, false, null, undefined, ...]或者结果内不含errCode)则将结果直接返回
-
如果是报错的结果(errCode为真值)将结果内的errCode和errMsg组合为错误对象抛出
-
如果是其他云函数未捕获的错误,直接将错误码和错误信息组合成错误对象抛出
前端抛出的错误对象上有以下属性
|属性名 |类型 |是否必备 |说明 |
|-- |-- |-- |-- |
|errCode |string
|
number |否 |错误码 |
|errMsg |string |否 |错误信息 |
|requestId |string |否 |当前请求的requestId |
|detail |Object |否 |完成的错误响应(仅在响应符合uniCloud响应体规范时才有) |
详见以下示例:
```
js
// user-center/index.obj.js
module
.
exports
=
{
updateUser
:
async
function
(
nickname
,
age
)
{
if
(
!
nickname
)
{
return
{
errCode
:
'
INVALID_NICKNAME
'
,
errMsg
:
'
更新失败
'
}
}
return
{
errCode
:
0
,
errMsg
:
'
更新成功
'
}
}
}
// 客户端代码
const
userCenter
=
uniCloud
.
importObject
(
'
user-center
'
)
try
{
// 不传username,云函数返回错误的响应
await
userCenter
.
updateUser
()
}
catch
(
e
)
{
// e.errCode === 'INVALID_NICKNAME'
// e.errMsg === '更新失败'
// e.detail === {errCode: 'INVALID_NICKNAME',errMsg: '更新失败'}
// e.requestId === 'xxxx'
}
try
{
const
res
=
await
userCenter
.
updateUser
(
'
dc
'
,
10
)
// res = {errCode: 0,errMsg: '更新成功'}
}
catch
(
e
)
{}
```
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录