当前位置: 首页 > news >正文

云侧工程云函数开发

云函数是一项Serverless计算服务,提供FaaS(Function as a Service)能力,可以类比于服务器端对外提供的API接口,相比于服务器端优势在于开发者只需要聚焦于业务逻辑实现、开发并上传函数代码,通过少量的代码可以实现类似服务器端操作数据库、存储等能力。还可以根据函数的实际使用流量对函数进行弹性伸缩,而无需对服务器资源进行管理,替开发者完全解决了传统应用开发与运维中的诸多复杂事务(如服务器配置与管理、代码部署、负载均衡、弹性伸缩、高可用保证等等)。

DevEco Studio集成开发工具提供端云协同开发能力,在云侧工程创建函数、实现业务逻辑代码、调试函数、部署函数,端侧通过少量的代码调用部署到AGC云端的云函数获取业务数据。云侧工程开发云函数总体流程如下所示:

image-20250622211144019

  • 创建并配置函数:云侧工程中创建函数、为函数配置入口以及调用的触发器等。
  • 开发函数:函数创建并配置完成后,在函数入口文件中编写业务逻辑代码。
  • 调试函数:业务逻辑代码编写完成后,在DevEco Studio中调试函数代码是否运行正常。
  • 部署函数:完成函数代码开发与调试后,开发者可以将函数部署到AGC云端,支持单个部署和批量部署。

1、创建配置云函数

1)创建云函数

展开云侧工程(CloudProgram),右击cloudfunctions目录,选择New > Cloud Function打开创建云函数向导。

image-20250622211151610

在创建云函数向导中输入云函数名称(如calculate-baby-age,该函数用于计算宝宝年龄,包含年、月、日、天数),函数名称长度2-63个字符,仅支持小写英文字母、数字、中划线(-),首字符必须为小写字母,结尾不能为中划线(-)。然后在“Select the Cloud Function Type”栏选择云函数Cloud Function(云对象Cloud Object会在后面的项目中进行介绍),最后点击OK按钮,等待DevEco Studio完成云函数创建。

image-20250622211203444

DevEco Studio完成云函数创建后,会在cloudfunctions目录新建get-due-date函数目录,并创建函数配置文件function-config.json、函数入口文件myCloudFunction.ts以及依赖配置文件package.json

image-20250622211209278

2)配置云函数

在云函数配置文件中,我们只需要关注配置触发器属性triggers,通过触发器暴露的触发条件来实现函数调用。而函数入口属性handler和函数类型functionType默认即可,特别需要注意的是functionType的值在创建时根据开发者选择的“Select the Cloud Function Type”类型自动生成,“0”表示云函数,“1”表示云对象,不可手动修改,否则会导致云函数部署失败。

DevEco Studio云侧工程云函数当前仅支持HTTP触发器,云函数创建成功后,会在云函数配置文件function-config.json文件中自动完成HTTP触发器配置。函数部署到云端后会自动生成触发器URL,开发者向URL发起HTTP请求时触发函数。

{"handler": "calculateBabyAge.myHandler","functionType": 0,"triggers": [{"type": "http","properties": {"enableUrlDecode": true,"authFlag": "true","authAlgor": "HDA-SYSTEM","authType": "apigw-client"}}]
}
  • type:触发器类型,端云协同工具中仅支持配置为http
  • properties:触发器属性。
    • enableUrlDecode:通过HTTP触发器触发函数时,对于contentTypeapplication/x-www-form-urlencoded的触发器请求,是否使用URLDecoder对请求body进行解码再转发到函数中。true表示启用;false表示不启用。
    • authFlag:是否鉴权,默认为true
    • authAlgor:鉴权算法,默认为HDA-SYSTEM
    • authType:HTTP触发器的认证类型。
      • apigw-client:端侧网关认证,适用于来自APP客户端侧(即本地应用或者项目)的函数调用。
      • cloudgw-client:云侧网关认证,适用于来自APP服务器侧(即云函数)的函数调用。

2、开发云函数

云函数创建和配置完成后,接下来可以编写函数业务逻辑代码。打开函数入口文件getDueDate.ts,在入口方法myHandler中编写业务逻辑代码,不建议重命名方法名称。

let myHandler = async function (event, context, callback, logger) {logger.info(event);// do something herecallback({code: 0,desc: "Success."});
};export { myHandler };
  • myHandler:入口方法名称。
  • event:调用方法传递的事件对象,JSON格式。采用触发器的方式实现函数调用,函数入口方法需要遵循对应触发器的event对象字段要求。本项目使用HTTP触发器,event对象数据格式如下所示:
    • path:HTTP请求触发URL路径。
    • httpMethod:触发器请求方式,目前HTTP触发器仅支持POST事件请求方式。
    • headers:请求头,指明请求或描述消息,一般包含"authorization"、“content-length”、“x-tenant-id”、“x-business-id”、“x-product-id”、“content-type”、“connection”、"accept-encoding"等字段,开发者可自定义。
    • queryStringParameters:请求数据的消息体,可由您自定义,JSON格式的字符串,最大为4MB。如果函数由应用客户端调用,在函数定义中需要在event.body获取用户客户端传入的HTTP body体,再从body体中解析传入的参数值。
    • isBase64Encoded:消息体是否为base64编码的布尔值标识。true:消息体为base64编码;false:消息体非base64编码。
  • context:函数运行时上下文对象,封装了日志接口、回调接口、环境变量env对象等。
  • callback:事件处理结果。函数必须通过显式调用callback(object)将事件处理结果返回给AGC,结果可以是任意对象,但必须与JSON.stringify兼容,AGC会将结果转换成JSON字符串,返回给调用方。callback执行完成,即函数执行结束。
  • logger:代码中可以使用logger接口记录日志,目前支持四种级别:
    • logger.debug()
    • logger.error()
    • logger.warn()
    • logger.info()
let myHandler = async function (event, context, callback, logger) {logger.info(event);// 获取端侧传递的参数let birthday = event.body?JSON.parse(event.body).birthday : event.birthday;try {// 计算宝宝的年龄const babyAge = calculateBabyAge(birthday);// 返回结果callback({code: 200,desc: "Success.",data: babyAge})} catch (error) {// 返回结果callback({code: 0,desc: error});}
};export { myHandler };/*** 表示宝宝年龄的类*/
class BabyAge {years: number;months: number;days: number;totalDays: number;/*** @param {number} years - 年数* @param {number} months - 月数* @param {number} days - 天数* @param {number} totalDays - 总天数*/constructor(years, months, days, totalDays) {this.years = years;this.months = months;this.days = days;this.totalDays = totalDays;}/*** 获取格式化的年龄字符串* @returns {string} 格式化的年龄字符串*/toString() {return `${this.years}${this.months}个月${this.days}`;}/*** 获取总天数的描述* @returns {string} 总天数的描述*/getTotalDaysString() {return `总共${this.totalDays}`;}/*** 获取完整的年龄描述* @returns {string} 完整的年龄描述*/getFullDescription() {return `${this.toString()}${this.getTotalDaysString()}`;}/*** 转换为JSON对象* @returns {Object} 包含年龄信息的对象*/toJSON() {return {years: this.years,months: this.months,days: this.days,totalDays: this.totalDays};}
}/*** 计算宝宝从出生到现在的详细年龄信息* @param {string} birthDate - 宝宝出生日期,格式:YYYY-MM-DD* @returns {BabyAge} 包含年、月、天的BabyAge实例*/
function calculateBabyAge(birthDate) {// 将生日字符串转换为Date对象const birth = new Date(birthDate);const today = new Date();// 确保输入的日期格式正确if (isNaN(birth.getTime())) {throw new Error('请输入正确的日期格式:YYYY-MM-DD');}// 检查生日是否在将来if (birth > today) {throw new Error('出生日期不能在将来');}// 计算年份差异let years = today.getFullYear() - birth.getFullYear();let months = today.getMonth() - birth.getMonth();let days = today.getDate() - birth.getDate();// 处理月份为负数的情况if (days < 0) {months--;// 获取上个月的最后一天const lastMonth = new Date(today.getFullYear(), today.getMonth(), 0);days += lastMonth.getDate();}// 处理月份为负数的情况if (months < 0) {years--;months += 12;}// 计算总天数const totalDays = Math.floor((today.getTime() - birth.getTime()) / (1000 * 60 * 60 * 24));// 返回BabyAge实例return new BabyAge(years, months, days, totalDays);
}

相关文章:

  • 测试工程师实战:用 LangChain+deepseek构建多轮对话测试辅助聊天机器人
  • Effective C++学习笔记
  • DeepSeek15-揭密模型上下文协议(MCP)
  • [学习] C语言<string.h>中字符串函数全解析
  • java专题漏洞总结 + 靶场练习
  • 开源 python 应用 开发(二)基于pyautogui、open cv 视觉识别的工具自动化
  • 关于程序的基本要素的详细讲解(从属GESP一级内容)
  • 端侧调用云存储实现头像存储
  • 查看shell选项状态命令详解
  • CentOS7.6 yum无法下载
  • 《HTTP权威指南》 第14章 安全HTTP
  • 小木的算法日记——合成两个有序链表
  • 系统思考:救火先放火
  • 优化通义大模型推理性能:企业级场景下的延迟与成本削减策略
  • 桌面小屏幕实战课程:DesktopScreen 3 Git工具使用
  • 21.安卓逆向2-frida hook技术-HookOkHttp的拦截器
  • 数智管理学(二十四)
  • C++ -- AVL树的插入和旋转
  • Linux 线程调度管理函数
  • leetcode:21. 合并两个有序链表
  • html5网站赏析/关键词排名怎样
  • 扬州市江都区城乡建设局网站/2021热门网络营销案例
  • 电脑可以做服务器部署网站吗/先做后付费的代运营
  • 建设银行网站入口/seo视频教程汇总
  • 网站备案登记查询/市场调研的内容
  • 网站统计怎么做/如何引流客源最快的方法