云函数是一段运行在云端的代码,无需管理服务器,在开发工具内编写、一键上传部署即可运行后端代码。云开发中的云函数可让用户将自身的业务逻辑代码上传,并通过云开发的调用触发函数,从而实现后端的业务运作。
云函数的传入参数有两个对象, event 对象和 context 对象。
云函数运行在云端 Linux 容器环境中,一个云函数在处理并发请求的时候会创建多个云函数实例,每个云函数实例之间相互隔离,没有公用的内存或硬盘空间。
小程序端需要配置云函数本地目录
在项目根目录中可以使用 project.config.json
文件,在其中定义 cloudfunctionRoot
字段,指定本地已存在的目录作为云函数的本地根目录。
云函数目录
:以云函数名字命名的目录,存放该云函数的所有代码。里面放以下文件。index.js
:云函数入口文件,云函数被调用时实际执行的入口函数是 index.js
中导出的 main
方法package.json
:npm 包定义文件,其中默认定义了最新 wx-server-sdk
依赖1、网页端云开发控制台创建。
登录腾讯云云开发控制台,单击需要开通云函数的环境,单击左侧菜单栏【云函数】,进入云函数页面,单击 【新建云函数】,填写函数名并确定即创建并部署成功。
2、微信开发者工具云开发控制台创建。
进入微信开发者工具云开发控制台,点击云函数,然后单击新建云函数创建。
3、微信开发者工具右键创建。
创建编写完后需要右键上传部署到云服务器。
4、本地创建后使用云开发 CLI提交云函数代码。
请参考TCB系列学习文章——搭建你的第一个web端云开发(三)
在函数列表的操作列,单击【删除】即可删除该函数。删除云函数不可恢复,并且删除后即不可访问,请谨慎操作。
若此环境为微信侧创建环境,则无法在腾讯云云开发控制台进行函数的删除。
需要注意的是,这边列表删除之后,本地还需需要手动删除,微信开发者工具也是一样。
您可以在控制台网页上编辑入口文件代码,或者在您的 IDE 里书写代码并将相关代码压缩成 zip 包在控制台上传并部署。
若此环境为微信侧创建环境,则无法在腾讯云云开发控制台进行编辑,只能在 IDE 中进行代码编辑及部署。
在函数列表的操作列,单击要操作的云函数名称。进入函数配置页。单击右上角【编辑】进入编辑模式,可以更改云函数的超时时间,默认时间为20s,最大值为20s,为保证前端体验,可以根据需要调整。
const app = tcb.init({//只要初始化一次就好啦
env: 'dev-abcdefg' // 此处填入您的环境ID
});
app.callFunction({
name: "sum",// 云函数名称
data: {a: 1,b:2 }// 传给云函数的参数
}).then( res => {
console.log(res);
}).catch( err =>{
console.log(err);
});
wx.cloud.callFunction({
name: 'sum',//调用名称为sum的云函数
data: { a: 1, b: 2 }//传递参数
}).then((res) => {//调用成功
console.log(res, res.result);
}).catch((err) => {//调用失败
console.log(err);
});
exports.main = async (event, context) => {
//小程序把tcb对象换成cloud对象
return await tcb.callFunction({//和在页面中调用一样使用 callFunction,示例调用sum函数
name: 'sum',
data: { x: 1, y: 2 }
})
}
参数统一为{a:1,b:2}
1、get方式调用
$.ajax({
url:'https://dev-test.service.tcloudbase.com/test?a=1&b=2',
type:'get',
success:function(res){
console.log(res);
}
});
2、post方式调用
$.ajax({
url:'https://dev-test.service.tcloudbase.com/test',
type:'post',
data:JSON.stringify({a:1,b:2}),//
success:function(res){
console.log(res);
}
});
3、服务器端的入参处理(nodejs)---
exports.main = async (event, context) => {
if(event.body) event = JSON.parse(event.body);//这是post方式需要的处理
event = event.queryStringParameters||event;//这是get方式需要的处理
return event;
}
4、处理解释()---
get方式是通过url传参的,所以云函数会把参数会自动放在event的queryStringParameters对象里。
post方式是通过body体传参的,所以会把参数自动放在event.body里面,并且由于传递的是字符串,所以做对象转换。
腾讯云入口环境创建的云函数:
npm install --save tcb-admin-node@latest
微信小程序入口环境创建的云函数:
npm install --save wx-server-sdk@latest
在调用 SDK 的各个方法前,需要先初始化:
腾讯云入口
const tcb = require('tcb-admin-node')//引用
tcb.init({//初始化
env: tcb.getCurrentEnv() //示例使用客户端所使用的环境ID,可以自由指定
})
微信小程序入口
const cloud = require('wx-server-sdk')//引用
cloud.init({//初始化
env: cloud.DYNAMIC_CURRENT_ENV //接下来的 API 调用都将请求到与该云函数当前所在环境相同的环境
})
//web端基于tcb对象
const db = tcb.database()//初始化数据库对象
//小程序基于cloud对象
const db = cloud.database()//初始化数据库对象
//开始使用
exports.main = async (event, context) => {
return db.collection('test').get()//返回数据集test的数据
}
const fs = require('fs')//额外引用文件流sdk
const path = require('path')//额外引用文件目录sdk
exports.main = async (event, context) => {
const fileStream = fs.createReadStream(path.join(__dirname, 'demo.jpg'))//创建一个文件流对象
return await tcb.uploadFile({//上传文件到云储存,小程序把tcb对象换成cloud对象
cloudPath: 'demo.jpg',
fileContent: fileStream,
})
}
exports.main = async (event, context) => {
//小程序把tcb对象换成cloud对象
return await tcb.callFunction({//和在页面中调用一样使用 callFunction,示例调用sum函数
name: 'sum',
data: { x: 1, y: 2 }
})
}
当从客户端调用云函数时,如在小程序中或者web端使用微信登录授权,云函数的传入参数中会被注入用户的openid
,开发者无需校验openid
的正确性,可以直接使用该openid
。与openid
一起注入云函数的还有其它相关的用户身份信息。
// index.js
const cloud = require('wx-server-sdk')
exports.main = (event, context) => {
// 这里获取到的 openId、 appId 和 unionId 是可信的,注意 unionId 仅在满足 unionId 获取条件时返回
const { OPENID, APPID, UNIONID } = cloud.getWXContext()
return {
OPENID,//微信openId
APPID,//微信appId
UNIONID,//用户唯一ID
}
}
//引用SDK
const tcb = require('tcb-admin-node');
//初始化SDK
tcb.init();
//获取用户信息
const userInfo = await tcb.auth().getUserInfo();
const {
openId, //微信openId,非微信授权登录则空
appId, //微信appId,非微信授权登录则空
uid, //用户唯一ID
customUserId //开发者自定义的用户唯一id,非自定义登录则空
} = userInfo
如果您的云函数拥有较多的依赖库或公共代码文件,您可以使用云函数中的「层」进行管理。
使用层管理,您可以将依赖放在层中而不是部署包中,可确保部署包保持较小的体积。对于 Node.js、Python 和 PHP 函数,只需将部署程序包保持在 10MB 以下,就可以在控制台中在线编辑函数代码。
创建层的压缩文件将按照层的版本进行存储。
层在与函数进行绑定时,将按照具体的层版本与函数版本进行绑定。
一个函数目前最多支持绑定 5 个层的具体版本,并在绑定时有一定顺序。
已绑定层的函数被触发运行,启动并发实例时,将会解压加载函数的运行代码至 /var/user/ 目录下,同时会将层内容解压加载至 /opt 目录下。
若需使用或访问的文件 file,放置在创建层时压缩文件的根目录下。则在解压加载后,可直接通过目录 /opt/file 访问到该文件。若在创建层时,通过文件夹进行压缩 dir/file,则在函数运行时需通过 /opt/dir/file 访问具体文件。
在函数绑定了多个层的情况下,层中文件的解压加载将按照绑定时的顺序进行。将按序号从小到大的顺序进行排序,排序越靠后侧层加载时间也相应靠后,但均会在函数的并发实例启动前完成加载。在函数代码初始化时,就已经可使用层中的文件了。
层中通常用来存储不经常变更的静态文件或代码依赖库。在存储代码依赖库时,可以直接将可用的依赖库打包并上传至层中。
例如,在 Python 环境中,可以将依赖库的代码包文件夹直接打包并创建为层,则在函数代码中可直接通过 import 引用。
在 Nodejs 环境中,可以将项目的 node_modules 依赖库文件夹打包并创建为层,则在函数代码中可直接通过 require 引用。
通过使用层,可以将函数代码和依赖库或依赖的静态文件分离,保持函数代码较小体积。在使用命令行工具、IDE 插件或控制台编辑函数时,均可以快速上传更新。
/opt
目录中,此目录在函数执行期间可访问。/opt
目录中。如果同一个文件出现在多个层中,云函数将会保留最大序号层里的文件。进入云开发控制台云函数页面,单击要配置的函数名称,单击页面右侧【编辑】,修改表单的定时触发器选项,可以上传配置文件或配置内容,单击【保存】。
在需要添加触发器的云函数目录下新建文件 config.json
,格式如下所示。
{
// triggers 字段是触发器数组,目前仅支持一个触发器,即数组只能填写一个,不可添加多个
"triggers": [
{
// name: 触发器的名字,规则见下方说明
"name": "myTrigger",
// type: 触发器类型,目前仅支持 timer (即定时触发器)
"type": "timer",
// config: 触发器配置,在定时触发器下,config 格式为 cron 表达式,规则见下方说明
"config": "0 0 2 1 * * *"
}
]
}
Cron 表达式有七个必需字段,按空格分隔。其中,每个字段都有相应的取值范围:
排序 | 字段 | 值 | 通配符 |
---|---|---|---|
第一位 | 秒 | 0 - 59的整数 | , - * / |
第二位 | 分钟 | 0 - 59的整数 | , - * / |
第三位 | 小时 | 0 - 23的整数 | , - * / |
第四位 | 日 | 1 - 31的整数(需要考虑月的天数) | , - * / |
第五位 | 月 | 1 - 12的整数或 JAN、FEB、MAR、APR、MAY、JUN、JUL、AUG、SEP、OCT、NOV和DEC | , - * / |
第六位 | 星期 | 0 - 6的整数或 MON、TUE、WED、THU、FRI、SAT和SUN,其中0指星期一,1指星期二,以此类推 | , - * / |
第七位 | 年 | 1970 - 2099的整数 | , - * / |
云开发CLI创建触发器请参考官方文档。
Hello World
事件模板。 模板在测试时作为 event 参数传递给函数。进入 云开发控制台云函数页面,单击【日志】,进入日志页面,您可以查看云函数的调用日志,方便开发者对代码进行调试。
进入 云开发控制台云函数页面,单击【监控】,进入监控页面,您可以查看云函数的调用次数、运行时间、错误次数。单击【导出数据】,您可以将这些数据全部导出。
1、云函数是nodejs函数,支持node依赖。
2、云函数运行在Linux环境下,性能相对稳定。
3、云函数自动扩容伸缩,无运维成本。
4、云函数是无状态和幂等的。
5、有着很方便的测试、日志与监控管理。
6、云开发的临时空间会自动销毁,注意存储文件必须要调用文件存储服务。
7、只要你会nodejs,真的都不怎么要学,就算不会,也可以乘机学习发展前景同样光明一片的nodejs对不对。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。