提交 53475e6f 编写于 作者: 雪洛's avatar 雪洛

docs: update cloud object

上级 f6c61873
...@@ -2,9 +2,9 @@ ...@@ -2,9 +2,9 @@
> 新增于 HBuilderX 3.4.0 > 新增于 HBuilderX 3.4.0
云对象本质上是对云函数的封装,和传统方式通过callFunction调用云函数相比,云对象写法更简单,调用更清晰。另外云对象默认支持[uniCloud响应体规范](uniCloud/cf-functions.md?id=resformat),对于满足规范的错误响应会在客户端自动抛出错误,开发者可以少写很多罗里吧嗦的判断。 云对象本质上是对云函数的封装,和传统方式通过callFunction调用云函数相比,云对象写法更简单,调用更清晰。另外云对象默认支持[uniCloud响应体规范](uniCloud/cf-functions.md?id=resformat),对于满足规范的错误响应会在客户端自动抛出错误,开发者可以少写很多繁琐的判断。
多action云函数为例,对比一下云对象和传统云函数 下面的云函数为例,对比一下云对象和传统云函数
**传统callFunction方式代码如下:** **传统callFunction方式代码如下:**
...@@ -15,44 +15,45 @@ ...@@ -15,44 +15,45 @@
'use strict'; 'use strict';
exports.main = async (event, context) => { exports.main = async (event, context) => {
const { const {
action, method,
params params
} = event } = event
switch(action) { switch(method) {
case 'updateUser': { case 'login': {
const { const {
nickname, username,
age password
} = params } = params
// 简化演示逻辑,此处不演示token校验 // 简化演示逻辑,此处不演示token校验
if(!nickname) { if(!username) {
return { return {
errCode: 'INVALID_NICKNAME', errCode: 'INVALID_USERNAME',
errMsg: '昵称不正确' errMsg: '用户名不正确'
} }
} }
// ...省略其他逻辑
return { return {
errCode: 0, errCode: 0,
errMsg: '更新成功' errMsg: '登录成功'
} }
} }
} }
return { return {
errCode: 'ACTION_NOT_FOUND', errCode: 'METHOD_NOT_FOUND',
errMsg: `action[action] not found` errMsg: `Method[${method}] not found`
} }
}; };
// 传统方式调用云函数-客户端代码 // 传统方式调用云函数-客户端代码
async function updateUser () { async function login () {
try { try {
const res = uniCloud.callFunction({ const res = uniCloud.callFunction({
name: 'user-center', name: 'user-center',
data: { data: {
action: 'updateUser', method: 'login',
params: { params: {
nickname: 'dc', username: 'dc',
age: 10 password: '123456'
} }
} }
}) })
...@@ -62,18 +63,18 @@ async function updateUser () { ...@@ -62,18 +63,18 @@ async function updateUser () {
} = res.result } = res.result
if(errCode) { if(errCode) {
uni.showModal({ uni.showModal({
title: '更新失败', title: '登录失败',
content: errMsg, content: errMsg,
showCancel: false showCancel: false
}) })
return return
} }
uni.showToast({ uni.showToast({
title: '更新成功' title: '登录成功'
}) })
} catch (e) { } catch (e) {
uni.showModal({ uni.showModal({
title: '更新失败', title: '登录失败',
content: e.message, content: e.message,
showCancel: false showCancel: false
}) })
...@@ -88,36 +89,37 @@ async function updateUser () { ...@@ -88,36 +89,37 @@ async function updateUser () {
// 云对象名:user-center // 云对象名:user-center
// 云对象入口index.obj.js内容如下 // 云对象入口index.obj.js内容如下
module.exports = { module.exports = {
updateUser(nickname, age) { login(username, password) {
if (!nickname) { if (!username) {
return { return {
errCode: 'INVALID_NICKNAME', errCode: 'INVALID_USERNAME',
errMsg: '昵称不正确' errMsg: '用户名不正确'
} }
} }
// ...登录逻辑
return { return {
errCode: 0, errCode: 0,
errMsg: '更新成功' errMsg: '登录成功'
} }
} }
} }
// 使用云对象的写法-客户端代码 // 使用云对象的写法-客户端代码
const userCenter = uniCloud.importObject('user-center') const userCenter = uniCloud.importObject('user-center')
async function updateUser () { async function login () {
try { try {
const res = await userCenter.updateUser('dc', 10) const res = await userCenter.login('dc', '123456')
uni.showToast({ uni.showToast({
title: '更新成功' title: '登录成功'
}) })
} catch (e) { } catch (e) {
// 此形式响应符合uniCloud响应体规范中的错误响应,自动抛出此错误 // 此形式响应符合uniCloud响应体规范中的错误响应,自动抛出此错误
// { // {
// errCode: 'INVALID_NICKNAME', // errCode: 'INVALID_USERNAME',
// errMsg: '昵称不正确' // errMsg: '用户名不正确'
// } // }
uni.showModal({ uni.showModal({
title: '更新失败', title: '登录失败',
content: e.errMsg, content: e.errMsg,
showCancel: false showCancel: false
}) })
...@@ -125,20 +127,20 @@ async function updateUser () { ...@@ -125,20 +127,20 @@ async function updateUser () {
} }
``` ```
可以看到大量的业务无关代码被简化掉,开发效率UP。此外通过`ObjectName.ActionName`的方式调用云函数和云端写法完全一致,心智负担大幅减小。请阅读以下内容深入了解云对象 可以看到大量的业务无关代码被简化掉,开发效率UP。此外通过`ObjectName.MethodName`的方式调用云函数和云端写法完全一致,心智负担大幅减小。请阅读以下内容深入了解云对象
## 规范 ## 规范
云对象和云函数都在cloudfunctions目录下,但是不同于云函数,云对象的入口为`index.obj.js`,而云函数则是`index.js`**为正确区分两者uniCloud做出了限制,云函数内不可存在index.obj.js,云对象内也不可存在index.js。**一个标准的云对象入口应导出一个对象,如下: 云对象和云函数都在cloudfunctions目录下,但是不同于云函数,云对象的入口为`index.obj.js`,而云函数则是`index.js`**为正确区分两者uniCloud做出了限制,云函数内不可存在index.obj.js,云对象内也不可存在index.js。**一个标准的云对象入口应导出一个对象,如下:
对象内每个键值对是一个action 对象内每个键值对是一个处理方法
```js ```js
// user-center/index.obj.js // user-center/index.obj.js
module.exports = { module.exports = {
updateUser: async function(nickname, age) { login: async function(username, password) {
console.log(nickname, age) console.log(username, password)
} // action updateUser } // login方法
} }
``` ```
...@@ -150,10 +152,36 @@ module.exports = { ...@@ -150,10 +152,36 @@ module.exports = {
```js ```js
const userCenter = uniCloud.importObject('user-center') 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 ...@@ -175,16 +203,16 @@ const res = await userCenter.updateUser('dc', 10) // 传入参数 nickname 和 a
```js ```js
// user-center/index.obj.js // user-center/index.obj.js
module.exports = { module.exports = {
updateUser: async function(nickname, age) { login: async function(username, password) {
if(!nickname) { if(!username) {
return { return {
errCode: 'INVALID_NICKNAME', errCode: 'INVALID_USERNAME',
errMsg: '更新失败' errMsg: '登录失败'
} }
} }
return { return {
errCode: 0, errCode: 0,
errMsg: '更新成功' errMsg: '登录成功'
} }
} }
} }
...@@ -193,17 +221,20 @@ module.exports = { ...@@ -193,17 +221,20 @@ module.exports = {
const userCenter = uniCloud.importObject('user-center') const userCenter = uniCloud.importObject('user-center')
try { try {
// 不传username,云函数返回错误的响应 // 不传username,云函数返回错误的响应
await userCenter.updateUser() await userCenter.login()
} catch (e) { } catch (e) {
// e.errCode === 'INVALID_NICKNAME' // e.errCode === 'INVALID_USERNAME'
// e.errMsg === '更新失败' // e.errMsg === '登录失败'
// e.detail === {errCode: 'INVALID_NICKNAME',errMsg: '更新失败'} // e.detail === {errCode: 'INVALID_USERNAME',errMsg: '登录失败'}
// e.requestId === 'xxxx' // e.requestId === 'xxxx'
} }
try { try {
const res = await userCenter.updateUser('dc', 10) const res = await userCenter.login('dc', '123456')
// res = {errCode: 0,errMsg: '更新成功'} // res = {errCode: 0,errMsg: '更新成功'}
} catch (e) {} } 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.
先完成此消息的编辑!
想要评论请 注册