快速上手
callFunction方式云函数,也称之为普通云函数
callFunction方式避免了服务器提供域名,不暴露固定ip,减少被攻击的风险。
uniCloud.callFunction可以在uni-app前端执行,也可以在uniCloud云函数中执行。也就是前端和云端都可以调用另一个云函数。
适用场景
对于非uni-app前端调用的场景,比如5+App、外部应用、服务器要调用云函数,或者uniCloud定时任务,此时不适合使用云对象,还是需要云函数。
callFunction方法
接收2个参数: name(string类型):云函数名称(必填),data(object类型):客户端需要传递的参数(非必填)
返回的json
云函数的入参
云函数的传入参数有两个,一个是event
对象,一个是context
对象。
event指的是触发云函数的事件。当客户端调用云函数时,event就是客户端调用云函数时传入的参数。
event对象,可以理解为客户端上行参数中的json对象。在使用uni-id且登录成功后,会自动多添加了一个uniIdToken属性
所以可以通过 event.uniIdToken
获取 uni-id 的 token (let token = event.uniIdToken )
context 对象包含了本次请求的上下文,包括客户端的ip、ua、appId等信息,以及云函数的环境情况、调用来源source等信息。
context对象的属性清单如下:
示例:
//定义index云函数
exports.main = async (event, context) => {
//event为客户端上传的参数
console.log('event : ', event)
if (!event.a) {
return {errCode : 1,errMsg : "参数a不能为空"}
}
if (!event.b) {
return {errCode : 2,errMsg : "参数b不能为空"}
}
const c = event.a + event.b
if (isNaN(c)) {
return {errCode : 3,errMsg : "参数a和b无法求和"}
}
//返回数据给客户端
return {sum:c,errCode : 1,errMsg : "0"}
};
//客户端调用
uniCloud.callFunction({
name: 'index', //云函数名称
data: {a:1,b:2} //参数
})
.then(res => {
console.log("res==>",res)
});
返回格式
普通云函数返回给客户端的是json格式数据。返回结果包裹在result下。
定时触发
在package.json内配置
阿里云:["cron:0 0 * * * *"]
Cron 表达式有七个必需字段,按空格分隔。其中,每个字段都有相应的取值范围:
通配符
需要注意的是阿里云不支持第七位,请自行去除代表年的位置
示例:
*/5 * * * * * * 表示每5秒触发一次
0 0 2 1 * * * 表示在每月的1日的凌晨2点触发
0 15 10 * * MON-FRI * 表示在周一到周五每天上午10:15触发
0 0 10,14,16 * * * * 表示在每天上午10点,下午2点,下午4点触发
0 */30 9-17 * * * * 表示在每天上午9点到下午5点内每半小时触发
0 0 12 * * WED * 表示在每个星期三中午12点触发
配置完成后会定时触发云对象内置特殊方法_timing
注意:
定时触发云对象时,_before和_after均不执行
定时触发云对象时_timing方法不会收到任何参数
云函数URL化
设置访问路径:如果配置某云函数路径为/test,实际访问/test、/test/a、/test/b都会执行此云函数,在云函数内可以使用event.path区分访问来源
阿里云使用默认域名时,在浏览器访问url化地址会触发下载。绑定自定义域名则无此问题
通过https://${云函数Url化域名}/${path}
直接访问函数,其中${path}是配置的函数触发路径或其子路径(云控制台需要设置path)
// 以uni.request为例
uni.request({
method: 'POST',
url: 'https://${云函数Url化域名}/${functionPath}',
data: {
a: 1,
b: 2
},
success(res) {
console.log(res);
}
})
//uniCloud cloundfunctions index.js
exports.main = async (event, context) => {
//event为客户端上传的参数
console.log('--event---> : ', event)
const {a,b} = JSON.parse(event.body)
return {
sum: parseInt(a) + parseInt(b),
errCode: 1,
errMsg: "0"
}
}
云函数接收到的event对象内容为
{
path: '/',
httpMethod: 'GET',
headers: {
'host': 'xxx.example.com',
'connection': 'close',
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36',
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
'accept-encoding': 'gzip, deflate, br',
'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8'
},
isBase64Encoded: false,
body: '{"a":1,"b":2}'}
}
如果需要获取客户端传递的参数 则JSON.parse(event.body)