在应用中使用数据源及其他后端服务
使用数据源
目前有两种使用数据源的方式: 可视化界面 、 低代码
可视化界面
通过可视化界面主要有两种形式: 通过变量管理 、通过组件
通过变量管理
在低码编辑器中, 还可以通过变量管理中通过添加数据源变量的方式来更方便的使用数据源.
数据源变量定义好后, 可通过下边两种方式使用:
- 可以在组件编辑时, 绑定数据源变量的值
- 还可以在低代码编辑器中使用
app.dataset.state.<全局数据源变量标志>
和$page.dataset.state.<页面数据源变量标志>
, 使用全局和页面的数据源变量
通过组件使用数据源
在 表单容器
等组件中, 可以绑定数据源, 并借助数据源的描述信息, 自动对组件进行配置:
在组件事件配置中, 亦可以绑定数据源方法:
在低代码中使用数据源
低码框架会在低码运行环境中注入全局对象以方便的访问使用数据源相关方法, 可以在 应用的低代码编辑器 及 微搭组件的组件代码 中使用.
有如下两种形式, 效果是一样的, 可根据自己需要来选择使用:
app.cloud.callDataSource({ dataSourceName: <数据源标志>, methodName: <数据源方法名称>, params: params }): Promise<Object>
// 注意: 若调用的数据源或数据源方法不存在, 会报语法错误
app.cloud.dataSources.<数据源标志>.<数据源方法名称>(params): Promise<Object>
调用参数
参数 | 类型 | 必须 | 说明 |
---|---|---|---|
dataSourceName | string | 是 | 数据源标志 |
methodName | string | 是 | 数据源方法名 |
params | any | 否 | 方法参数 |
返回结果
返回结果即对应数据源方法的出参定义的结构. 若调用出错则可以catch
错误
注意: 数据源方法都是异步的, 使用时需要注意.
在低代码编辑器中则可以在全局或者页面的生命周期、handler 中使用上述形式使用数据源.
例如, 在 自定义 handler createGood
中调用 商品数据源(goods_q72t0pd) 的 新建(wedaCreate) 方法:
export default async function (params) {
try {
const data = await app.cloud.callDataSource({ dataSourceName: 'goods_q72t0pd', methodName: 'wedaCreate', params: params });
// 下面这种方式效果一致
// const data = await app.cloud.dataSources.goods_q72t0pd.wedaCreate(params);
console.log('请求结果', data)
} catch (e) {
console.log('错误代码', e.code, '错误信息', e.message);
}
}
调用其他后端服务
下述API亦可以在应用的低代码编辑器 及 微搭组件的组件代码 中使用.
app.cloud.getTempFileURL
获取云存储文件的临时访问链接, 即将 cloud://xxxx
协议的私有地址转换为 http
协议的正常地址
方法定义:
// 获取单个cos文件的公有访问地址, 获取成功则返回 字符串即链接地址, 失败则为 undefined
cloud.getTempFileURL(fileId: string) => Promise<string | undefined>
// 获取多个时, 返回结果为对象, 只包含获取成功的fileId结果, key 为 fileId, value 为其对应的链接地址
cloud.getTempFileURL(fileIds: string[]) => Promise<Record<string, string>>
示例:
cloud.getTempFileURL('cloud://tcb-demo-10cf5b.7463-tcb-demo-10cf5b-1302484483/images/pic_netbian_com/001714-162653863412dd.jpg')
.then(url => console.log(url))
cloud.getTempFileURL([
'cloud://tcb-demo-10cf5b.7463-tcb-demo-10cf5b-1302484483/images/pic_netbian_com/001714-162653863412dd.jpg',
'cloud://tcb-demo-10cf5b.7463-tcb-demo-10cf5b-1302484483/images/pic_netbian_com/001935-16159115757f04.jpg'
]).then(res => {
console.log(res['cloud://tcb-demo-10cf5b.7463-tcb-demo-10cf5b-1302484483/images/pic_netbian_com/001935-16159115757f04.jpg'])
})
app.cloud.utils
cloud-sdk的辅助工具方法
cloud.utils.wrapperDatasourceMethod
传入数据源的名称和方法名称, 返回该数据源方法的函数
方法定义:
(options: IWrapperDatasourceOptions) => ((params: IDsParams) => Promise<IDsResponse>)
interface IWrapperDatasourceOptions {
/** 数据源名称 */
dataSourceName: string;
/** 底层查询使用的数据源方法 */
methodName: string;
}
/**
* IDsParams 数据源方法的入参
* IDsResponse 数据源方法的出参
*/
示例:
const createUser = app.cloud.utils.wrapperDatasourceMethod({dataSourceName: 'user', methodName: 'wedaCreate'});
// createUser 与 app.cloud.dataSources.user.wedaCreate 功能是一样
createUser({name: 'Ashram', age: '38'}).then(res => console.log(res._id))
注意
capp.loud.utils.wrapperDatasourceMethod
与 app.cloud.dataSources.<dataSourceName>.<methodName>
区别:
app.cloud.utils.wrapperDatasourceMethod
为函数调用- 若数据源标识或方法名不存在, 调用
app.cloud.utils.wrapperDatasourceMethod
时不会报错, 返回的函数在使用时才会报错
app.cloud.getCloudInstance
返回云开发web-sdk初始化后的实例(无需关心tcb环境信息及认证登录的处理), 即 tcb.init
后返回的对象, 可用该对象直接调用tcb的各种能力.
方法定义:
() => Promise<CloudInstance>
示例:
app.cloud.getCloudInstance().then(app => {
// 调用云函数
app.callFunction({
name: "test",
data: { a: 1 }
})
.then((res) => {
const result = res.result; //云函数执行结果
})
})
云开发web-sdk的详细用法可参考官方文档: https://docs.cloudbase.net/api-reference/webv2/initialization.html
app.cloud.callFunction
调用云开发的云函数, 与 app.cloud.getCloudInstance
示例中的效果大体一致.
方法定义:
(params: ICallFunctionParams, parseOptions?: IParseOptions) => Promise<any>
/**
* 调用云函数的参数
*/
interface ICallFunctionParams {
/** TCB云函数名称 */
name: string
/** 云函数接收的参数 */
data?: any
}
/** 解析云开发云函数调用结果配置 */
interface IParseOptions {
/**
* 解析 云开发云函数的通用response 包装
* 为true, 则返回 res.result, 此时会丢失 res.requestId 信息
*/
unwrapResult?: boolean
/**
* 解析业务信息
* 需配合 unwrapResult 使用
* 为 true 时, res.result.code 非 0 抛出错误, 为 0 则返回 res.result.data
*/
parseBusinessInfo?: boolean
}
示例:
app.cloud.callFunction({
name: "test",
data: { a: 1 }
})
.then((res) => {
const result = res; //云函数执行结果
})
app.cloud.callWedaApi
调用微搭后端API服务
方法定义:
(params: ICallWedaApiParams) => Promise<any>
interface ICallWedaApiParams {
/** 方法名称 */
action: string
/**
* 方法的自定义参数
* 其中 envType, envId, uid, source 均无需填写
*/
data?: Record<string, any>
/**
* 是否自动将 data 的key 改为大写驼峰
* 默认为 true, 即使用时 data 可以采用小驼峰的 key
*/
capitalizeDataKey?: boolean
}
示例:
// 查询当前用户的weda Id
app.cloud.callWedaApi({
action: 'DescribeWedaUserId'
}).then(res => console.log(res))
app.cloud.callWorkflow
调用微搭流程服务
方法定义:
(params: ICallWedaApiParams) => Promise<any>
interface ICallWedaApiParams {
/** 方法名称 */
action: string
/**
* 方法的自定义参数
* 其中 envType, envId, uid, source 均无需填写
*/
data?: Record<string, any>
/**
* 是否自动将 data 的key 改为大写驼峰
* 默认为 true, 即使用时 data 可以采用小驼峰的 key
*/
capitalizeDataKey?: boolean
}
示例:
app.cloud.callWorkflow({
action: 'DescribeProcessInstanceDetails',
data: {
processInstanceId: 'xxxxxx'
}
}).then(res => console.log(res))