Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
DCloud
unidocs-zh
提交
53475e6f
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看板
提交
53475e6f
编写于
2月 16, 2022
作者:
雪洛
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
docs: update cloud object
上级
f6c61873
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
79 addition
and
48 deletion
+79
-48
docs/uniCloud/cloud-obj.md
docs/uniCloud/cloud-obj.md
+79
-48
未找到文件。
docs/uniCloud/cloud-obj.md
浏览文件 @
53475e6f
...
...
@@ -2,9 +2,9 @@
> 新增于 HBuilderX 3.4.0
云对象本质上是对云函数的封装,和传统方式通过callFunction调用云函数相比,云对象写法更简单,调用更清晰。另外云对象默认支持
[
uniCloud响应体规范
](
uniCloud/cf-functions.md?id=resformat
)
,对于满足规范的错误响应会在客户端自动抛出错误,开发者可以少写很多
罗里吧嗦
的判断。
云对象本质上是对云函数的封装,和传统方式通过callFunction调用云函数相比,云对象写法更简单,调用更清晰。另外云对象默认支持
[
uniCloud响应体规范
](
uniCloud/cf-functions.md?id=resformat
)
,对于满足规范的错误响应会在客户端自动抛出错误,开发者可以少写很多
繁琐
的判断。
以
多action
云函数为例,对比一下云对象和传统云函数
以
下面的
云函数为例,对比一下云对象和传统云函数
**传统callFunction方式代码如下:**
...
...
@@ -15,44 +15,45 @@
'
use strict
'
;
exports
.
main
=
async
(
event
,
context
)
=>
{
const
{
action
,
method
,
params
}
=
event
switch
(
action
)
{
case
'
updateUser
'
:
{
switch
(
method
)
{
case
'
login
'
:
{
const
{
nick
name
,
age
user
name
,
password
}
=
params
// 简化演示逻辑,此处不演示token校验
if
(
!
nick
name
)
{
if
(
!
user
name
)
{
return
{
errCode
:
'
INVALID_
NICK
NAME
'
,
errMsg
:
'
昵称
不正确
'
errCode
:
'
INVALID_
USER
NAME
'
,
errMsg
:
'
用户名
不正确
'
}
}
// ...省略其他逻辑
return
{
errCode
:
0
,
errMsg
:
'
更新
成功
'
errMsg
:
'
登录
成功
'
}
}
}
return
{
errCode
:
'
ACTION
_NOT_FOUND
'
,
errMsg
:
`
action[action
] not found`
errCode
:
'
METHOD
_NOT_FOUND
'
,
errMsg
:
`
Method[
${
method
}
] not found`
}
};
// 传统方式调用云函数-客户端代码
async
function
updateUser
()
{
async
function
login
()
{
try
{
const
res
=
uniCloud
.
callFunction
({
name
:
'
user-center
'
,
data
:
{
action
:
'
updateUser
'
,
method
:
'
login
'
,
params
:
{
nick
name
:
'
dc
'
,
age
:
10
user
name
:
'
dc
'
,
password
:
'
123456
'
}
}
})
...
...
@@ -62,18 +63,18 @@ async function updateUser () {
}
=
res
.
result
if
(
errCode
)
{
uni
.
showModal
({
title
:
'
更新
失败
'
,
title
:
'
登录
失败
'
,
content
:
errMsg
,
showCancel
:
false
})
return
}
uni
.
showToast
({
title
:
'
更新
成功
'
title
:
'
登录
成功
'
})
}
catch
(
e
)
{
uni
.
showModal
({
title
:
'
更新
失败
'
,
title
:
'
登录
失败
'
,
content
:
e
.
message
,
showCancel
:
false
})
...
...
@@ -88,36 +89,37 @@ async function updateUser () {
// 云对象名:user-center
// 云对象入口index.obj.js内容如下
module
.
exports
=
{
updateUser
(
nickname
,
age
)
{
if
(
!
nick
name
)
{
login
(
username
,
password
)
{
if
(
!
user
name
)
{
return
{
errCode
:
'
INVALID_
NICK
NAME
'
,
errMsg
:
'
昵称
不正确
'
errCode
:
'
INVALID_
USER
NAME
'
,
errMsg
:
'
用户名
不正确
'
}
}
// ...登录逻辑
return
{
errCode
:
0
,
errMsg
:
'
更新
成功
'
errMsg
:
'
登录
成功
'
}
}
}
// 使用云对象的写法-客户端代码
const
userCenter
=
uniCloud
.
importObject
(
'
user-center
'
)
async
function
updateUser
()
{
async
function
login
()
{
try
{
const
res
=
await
userCenter
.
updateUser
(
'
dc
'
,
10
)
const
res
=
await
userCenter
.
login
(
'
dc
'
,
'
123456
'
)
uni
.
showToast
({
title
:
'
更新
成功
'
title
:
'
登录
成功
'
})
}
catch
(
e
)
{
// 此形式响应符合uniCloud响应体规范中的错误响应,自动抛出此错误
// {
// errCode: 'INVALID_
NICK
NAME',
// errMsg: '
昵称
不正确'
// errCode: 'INVALID_
USER
NAME',
// errMsg: '
用户名
不正确'
// }
uni
.
showModal
({
title
:
'
更新
失败
'
,
title
:
'
登录
失败
'
,
content
:
e
.
errMsg
,
showCancel
:
false
})
...
...
@@ -125,20 +127,20 @@ async function updateUser () {
}
```
可以看到大量的业务无关代码被简化掉,开发效率UP。此外通过
`ObjectName.
Action
Name`
的方式调用云函数和云端写法完全一致,心智负担大幅减小。请阅读以下内容深入了解云对象
可以看到大量的业务无关代码被简化掉,开发效率UP。此外通过
`ObjectName.
Method
Name`
的方式调用云函数和云端写法完全一致,心智负担大幅减小。请阅读以下内容深入了解云对象
## 规范
云对象和云函数都在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
login
:
async
function
(
username
,
password
)
{
console
.
log
(
username
,
password
)
}
//
login方法
}
```
...
...
@@ -150,10 +152,36 @@ module.exports = {
```
js
const
userCenter
=
uniCloud
.
importObject
(
'
user-center
'
)
const
res
=
await
userCenter
.
updateUser
(
'
dc
'
,
10
)
// 传入参数 nickname 和 age,参数和云对象内的action
完全一致
const
res
=
await
userCenter
.
login
(
'
dc
'
,
'
123456
'
)
// 传入参数 username 和 password,参数和云对象内的方法
完全一致
```
### 客户端调用返回值@return-value
### 云函数或云对象内调用@call-by-cloud
云函数或云对象内也可以调用同一服务空间内的云对象,用法和客户端调用云对象一致
```
js
const
userCenter
=
uniCloud
.
importObject
(
'
user-center
'
)
const
res
=
await
userCenter
.
login
(
'
dc
'
,
'
123456
'
)
// 传入参数 username 和 password,参数和云对象内的方法完全一致
```
### 跨服务空间调用云对象@call-by-cloud-cross-space
云端或者客户端均有uniCloud.init方法可以获取其他服务空间的uniCloud实例,使用此实例的importObject可以调用其他服务空间的云对象,参考:
[](
uniCloud/concepts/space.md?id=multi-space
)
客户端无论腾讯阿里均支持。云端
`uniCloud.init`
方法仅腾讯云支持,且仅能获取同账号下的腾讯云服务空间的uniCloud实例。
**示例代码**
```
js
const
mycloud
=
uniCloud
.
init
({
provider
:
'
tencent
'
,
spaceId
:
'
xxx
'
})
const
userCenter
=
mycloud
.
importObject
(
'
user-center
'
)
const
loginRes
=
await
mycloud
.
login
(
'
dc
'
,
'
123456
'
)
```
### 云对象的返回值@return-value
客户端拿到云对象的响应结果后,会自动进行结果的处理。
...
...
@@ -175,16 +203,16 @@ const res = await userCenter.updateUser('dc', 10) // 传入参数 nickname 和 a
```
js
// user-center/index.obj.js
module
.
exports
=
{
updateUser
:
async
function
(
nickname
,
age
)
{
if
(
!
nick
name
)
{
login
:
async
function
(
username
,
password
)
{
if
(
!
user
name
)
{
return
{
errCode
:
'
INVALID_
NICK
NAME
'
,
errMsg
:
'
更新
失败
'
errCode
:
'
INVALID_
USER
NAME
'
,
errMsg
:
'
登录
失败
'
}
}
return
{
errCode
:
0
,
errMsg
:
'
更新
成功
'
errMsg
:
'
登录
成功
'
}
}
}
...
...
@@ -193,17 +221,20 @@ module.exports = {
const
userCenter
=
uniCloud
.
importObject
(
'
user-center
'
)
try
{
// 不传username,云函数返回错误的响应
await
userCenter
.
updateUser
()
await
userCenter
.
login
()
}
catch
(
e
)
{
// e.errCode === 'INVALID_
NICK
NAME'
// e.errMsg === '
更新
失败'
// e.detail === {errCode: 'INVALID_
NICKNAME',errMsg: '更新
失败'}
// e.errCode === 'INVALID_
USER
NAME'
// e.errMsg === '
登录
失败'
// e.detail === {errCode: 'INVALID_
USERNAME',errMsg: '登录
失败'}
// e.requestId === 'xxxx'
}
try
{
const
res
=
await
userCenter
.
updateUser
(
'
dc
'
,
10
)
const
res
=
await
userCenter
.
login
(
'
dc
'
,
'
123456
'
)
// res = {errCode: 0,errMsg: '更新成功'}
}
catch
(
e
)
{}
```
## 本地运行@run-local
云对象无法直接本地运行,可以通过其他云函数调用本地云对象(在调用云对象的云函数右键本地运行),或者客户端调用本地云对象的方式来实现云对象的本地运行。
\ No newline at end of file
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录