Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
程序yang
unidocs-zh
提交
53475e6f
U
unidocs-zh
项目概览
程序yang
/
unidocs-zh
与 Fork 源项目一致
Fork自
DCloud / unidocs-zh
通知
1
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
U
unidocs-zh
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
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.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录