前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >TCB系列学习文章——云开发的云函数篇(四)

TCB系列学习文章——云开发的云函数篇(四)

原创
作者头像
F颜
修改2021-01-17 22:05:38
2.8K0
修改2021-01-17 22:05:38
举报

云函数介绍

1、什么是云函数

云函数是一段运行在云端的代码,无需管理服务器,在开发工具内编写、一键上传部署即可运行后端代码。云开发中的云函数可让用户将自身的业务逻辑代码上传,并通过云开发的调用触发函数,从而实现后端的业务运作。

云函数的传入参数有两个对象, event 对象和 context 对象。

  • event 对象指的是触发云函数的事件,event 就是小程序端调用云函数时传入的参数。
  • context 对象包含了此处调用的调用信息和运行状态,可以使用 context 了解服务运行的情况。

2、云函数的运行环境

云函数运行在云端 Linux 容器环境中,一个云函数在处理并发请求的时候会创建多个云函数实例,每个云函数实例之间相互隔离,没有公用的内存或硬盘空间。

3、云函数特性

  1. 云函数应是无状态的,幂等的,即一次云函数的执行不依赖上一次云函数执行过程中在运行环境中残留的信息。
  2. 开发者无需关心云函数扩容和缩容的问题,平台会根据负载自动进行扩缩容。
  3. 云开发的云函数内存统一为256Mb,不支持配置。

云函数的管理

小程序端注意事项

小程序端需要配置云函数本地目录

在项目根目录中可以使用 project.config.json 文件,在其中定义 cloudfunctionRoot 字段,指定本地已存在的目录作为云函数的本地根目录。

云函数结构解析

  • 云函数目录:以云函数名字命名的目录,存放该云函数的所有代码。里面放以下文件。
  • index.js:云函数入口文件,云函数被调用时实际执行的入口函数是 index.js 中导出的 main 方法
  • package.json:npm 包定义文件,其中默认定义了最新 wx-server-sdk 依赖

1、创建云函数

1、网页端云开发控制台创建。

登录腾讯云云开发控制台,单击需要开通云函数的环境,单击左侧菜单栏【云函数】,进入云函数页面,单击 【新建云函数】,填写函数名并确定即创建并部署成功。

2、微信开发者工具云开发控制台创建。

进入微信开发者工具云开发控制台,点击云函数,然后单击新建云函数创建。

3、微信开发者工具右键创建。

创建编写完后需要右键上传部署到云服务器。

4、本地创建后使用云开发 CLI提交云函数代码。

请参考TCB系列学习文章——搭建你的第一个web端云开发(三)

2、删除云函数

在函数列表的操作列,单击【删除】即可删除该函数。删除云函数不可恢复,并且删除后即不可访问,请谨慎操作。

若此环境为微信侧创建环境,则无法在腾讯云云开发控制台进行函数的删除。

需要注意的是,这边列表删除之后,本地还需需要手动删除,微信开发者工具也是一样。

3、修改云函数

您可以在控制台网页上编辑入口文件代码,或者在您的 IDE 里书写代码并将相关代码压缩成 zip 包在控制台上传并部署。

若此环境为微信侧创建环境,则无法在腾讯云云开发控制台进行编辑,只能在 IDE 中进行代码编辑及部署。

网页端在线编辑
网页端在线编辑

4、更改云函数超时时间

在函数列表的操作列,单击要操作的云函数名称。进入函数配置页。单击右上角【编辑】进入编辑模式,可以更改云函数的超时时间,默认时间为20s,最大值为20s,为保证前端体验,可以根据需要调整。

配置云函数超时
配置云函数超时

云函数的使用

1、web网页调用云函数

代码语言:javascript
复制
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);
});

2、小程序页面调用云函数

代码语言:javascript
复制
wx.cloud.callFunction({
  name: 'sum',//调用名称为sum的云函数
  data: { a: 1, b: 2 }//传递参数
}).then((res) => {//调用成功
  console.log(res, res.result);
}).catch((err) => {//调用失败
  console.log(err);
});

3、云函数调用云函数

代码语言:javascript
复制
exports.main = async (event, context) => {
  //小程序把tcb对象换成cloud对象
  return await tcb.callFunction({//和在页面中调用一样使用 callFunction,示例调用sum函数
    name: 'sum',
    data: { x: 1, y: 2 }
  })
}

4、云接入调用云函数

代码语言:javascript
复制
参数统一为{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里面,并且由于传递的是字符串,所以做对象转换。

服务器SDK的使用

1、安装sdk

腾讯云入口环境创建的云函数:

代码语言:javascript
复制
npm install --save tcb-admin-node@latest

微信小程序入口环境创建的云函数:

代码语言:javascript
复制
npm install --save wx-server-sdk@latest

2、初始化SDK

初始化 SDK

在调用 SDK 的各个方法前,需要先初始化:

腾讯云入口

代码语言:javascript
复制
const tcb = require('tcb-admin-node')//引用
tcb.init({//初始化
  env: tcb.getCurrentEnv() //示例使用客户端所使用的环境ID,可以自由指定
})

微信小程序入口

代码语言:javascript
复制
const cloud = require('wx-server-sdk')//引用
cloud.init({//初始化
  env: cloud.DYNAMIC_CURRENT_ENV //接下来的 API 调用都将请求到与该云函数当前所在环境相同的环境
})

3、访问数据库

代码语言:javascript
复制
//web端基于tcb对象
const db = tcb.database()//初始化数据库对象

//小程序基于cloud对象
const db = cloud.database()//初始化数据库对象

//开始使用
exports.main = async (event, context) => {
  return db.collection('test').get()//返回数据集test的数据
}

4、访问文件存储

代码语言:javascript
复制
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,
  })
}

5、访问其它函数

代码语言:javascript
复制
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一起注入云函数的还有其它相关的用户身份信息。

1、小程序发起云调用

代码语言:javascript
复制
// 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
  }
}

2、web端发起云调用

代码语言:javascript
复制
//引用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 目录中。如果同一个文件出现在多个层中,云函数将会保留最大序号层里的文件。

层管理相关操作

第 1 步:创建层

  1. 登录云开发控制台,进入到环境中,点击左侧云函数菜单,再点击「层管理 (opens new window)」,进入“层”列表页面。
  1. 在「新建层」页面,根据实际需求设置层信息。如下图所示:
  • 层名称:输入自定义层名称。
  • 描述:层的描述信息,根据实际情况填写。
  • 层代码:支持本地上传 zip 包,最大支持 50 M。确定提交方法后单击「上传」,在弹出的依赖包选择界面,选择需上传的依赖包并单击「确定」。
  • 添加运行环境:该层的兼容运行环境,最多可设置 5 个。
  1. 单击「确定」即可成功创建。

第 2 步:云函数绑定层

  1. 选择需进行层管理的函数,进入函数管理页面。
  2. 选择「层管理」页签,并单击「绑定」。如下图所示:
  1. 在弹出的“绑定层”窗口中,选择对应「层名称」及「层版本」。如下图所示:
  1. 单击「确定」即可完成绑定。

定时触发器

1、腾讯云云开发控制台

进入云开发控制台云函数页面,单击要配置的函数名称,单击页面右侧【编辑】,修改表单的定时触发器选项,可以上传配置文件或配置内容,单击【保存】。

2、微信小程序云开发控制台

在需要添加触发器的云函数目录下新建文件 config.json,格式如下所示。

代码语言:javascript
复制
{
  // triggers 字段是触发器数组,目前仅支持一个触发器,即数组只能填写一个,不可添加多个
  "triggers": [
    {
      // name: 触发器的名字,规则见下方说明
      "name": "myTrigger",
      // type: 触发器类型,目前仅支持 timer (即定时触发器)
      "type": "timer",
      // config: 触发器配置,在定时触发器下,config 格式为 cron 表达式,规则见下方说明
      "config": "0 0 2 1 * * *"
    }
  ]
}

Cron 表达式

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的整数

, - * /

3、云开发 CLI

云开发CLI创建触发器请参考官方文档

测试、日志与监控

1、测试

  1. 云开发提供了云函数测试功能,可以更加方便地调试您的代码。在控制台的对应云函数的管理面板中,单击右上角【测试】,即可打开测试弹窗。
  • 腾讯云云开发控制台
  • 小程序云开发控制台
  1. 单击【提交方法】下拉菜单,可以选择测试函数的模版方法,当前只支持 Hello World 事件模板。 模板在测试时作为 event 参数传递给函数。
  2. 在“测试参数”的编辑器中输入想测试的参数后,单击【执行】,即可运行代码。执行完毕后,运行结果将显示在“运行测试”栏中。

2、日志

进入 云开发控制台云函数页面,单击【日志】,进入日志页面,您可以查看云函数的调用日志,方便开发者对代码进行调试。

  • 腾讯云云开发控制台
  • 小程序云开发控制台

3、监控

进入 云开发控制台云函数页面,单击【监控】,进入监控页面,您可以查看云函数的调用次数、运行时间、错误次数。单击【导出数据】,您可以将这些数据全部导出。

  • 腾讯云云开发控制台
  • 小程序云开发控制台

总结

1、云函数是nodejs函数,支持node依赖。

2、云函数运行在Linux环境下,性能相对稳定。

3、云函数自动扩容伸缩,无运维成本。

4、云函数是无状态和幂等的。

5、有着很方便的测试、日志与监控管理。

6、云开发的临时空间会自动销毁,注意存储文件必须要调用文件存储服务。

7、只要你会nodejs,真的都不怎么要学,就算不会,也可以乘机学习发展前景同样光明一片的nodejs对不对。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 云函数介绍
    • 1、什么是云函数
      • 2、云函数的运行环境
        • 3、云函数特性
        • 云函数的管理
          • 小程序端注意事项
            • 云函数结构解析
              • 1、创建云函数
                • 2、删除云函数
                  • 3、修改云函数
                    • 4、更改云函数超时时间
                    • 云函数的使用
                      • 1、web网页调用云函数
                        • 2、小程序页面调用云函数
                          • 3、云函数调用云函数
                            • 4、云接入调用云函数
                            • 服务器SDK的使用
                              • 1、安装sdk
                                • 2、初始化SDK
                                  • 初始化 SDK
                                • 3、访问数据库
                                  • 4、访问文件存储
                                    • 5、访问其它函数
                                      • 1、小程序发起云调用
                                      • 2、web端发起云调用
                                  • 获取用户信息
                                  • 层管理
                                    • 工作方式
                                      • 创建与绑定
                                      • 运行时加载与访问
                                      • 推荐使用方式
                                    • 说明事项
                                      • 层管理相关操作
                                        • 第 1 步:创建层
                                        • 第 2 步:云函数绑定层
                                        • 1、腾讯云云开发控制台
                                        • 2、微信小程序云开发控制台
                                        • Cron 表达式
                                        • 3、云开发 CLI
                                        • 1、测试
                                        • 2、日志
                                        • 3、监控
                                    • 定时触发器
                                    • 测试、日志与监控
                                    • 总结
                                    相关产品与服务
                                    云函数
                                    云函数(Serverless Cloud Function,SCF)是腾讯云为企业和开发者们提供的无服务器执行环境,帮助您在无需购买和管理服务器的情况下运行代码。您只需使用平台支持的语言编写核心代码并设置代码运行的条件,即可在腾讯云基础设施上弹性、安全地运行代码。云函数是实时文件处理和数据处理等场景下理想的计算平台。
                                    领券
                                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档