在鸿蒙(HarmonyOS 5),创建云函数以及调用和传参

[复制链接]
发表于 2025-5-28 17:20:20 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
在鸿蒙(HarmonyOS)开发中,创建云函数是端云一体化开发的重要组成部门,主要用于实现服务端的业务逻辑。以下是详细的步骤和说明:
1. 开通云函数服务(AGC)



  • 注册并登录AppGallery Connect (AGC):在华为AGC平台创建项目和应用256。
  • 开通云函数服务:在项目设置中开通云函数功能,免费档支持每月100万次调用268。
2. 使用DevEco Studio创建端云一体化项目



  • 选择端云一体化模板创建项目,确保Bundle name与AGC中的应用包名一致257。
  • 项目结构包含:

3. 创建云函数



  • 在cloudfunctions目次右键选择 New > Cloud Function,输入函数名称(如my-cloud-function),定名规则为小写字母、数字或中划线127。
  • 生成的文件包括:

    • function-config.json(触发器配置)
    • myCloudFunction.ts(入口文件)
    • package.json(依赖管理)17。

4. 编写云函数代码

云函数使用TypeScript开发,标准格式如下:
  1. /*
  2. event:调用时传入的参数(如HTTP请求体)。
  3. context:执行上下文(环境变量等)。
  4. callback:返回结果。
  5. logger:日志日志记录
  6. */
  7. let myHandler = async function (event, context, callback, logger) {
  8.   logger.info(event);
  9.   // do something here
  10.   callback({
  11.     code: 0,
  12.     message: "Success." + Math.random()
  13.   });
  14. };
  15. export { myHandler };
复制代码


  • 参数说明:

    • event:调用时传入的参数(如HTTP哀求体)。
    • context:实行上下文(环境变量等)。
    • callback:返回结果。
    • logger:日志日志记录237。

5. 配置触发器

在function-config.json中配置HTTP触发器,支持鉴权和URL解码等属性:
  1. {
  2.     "type": "http",
  3.     "properties": {
  4.         "enableUrlDecode": true,
  5.         "authFlag": "true",
  6.         "authType": "apigw-client"
  7.     }
  8. }
复制代码


  • 部署后会自动生成触发URL17。
6. 调试与部署



  • 本地调试:右键cloudfunctions选择 Run Cloud Functions,需安装华为提供的Node.js环境27。

  • 云端部署:右键选择 Deploy Cloud Functions,需登录华为开发者账号。部署后可在AGC控制台查看和测试257。

7. 端侧调用云函数

检查agconnect-services.json中是否有云函数配置:
  1.   "services": {
  2.     "cloudfunction": {
  3.       "functions": [
  4.         {
  5.           "name": "hello",
  6.           "version": "$latest"
  7.         }
  8.       ]
  9.     }
  10.   }
复制代码
注:version  :"1"  // 1为版本,$latest 为最新版本(建议使用)

通过cloud.callFunction调用:
  1. import cloud from '@hw-agconnect/cloud'
  2. @Entry
  3. @Component
  4. struct Test{
  5.   @State message:string = '初始数据'
  6.   build() {
  7.     Column(){
  8.       Text(this.message)
  9.         .fontSize(24)
  10.       Button('测试云函数')
  11.         .onClick(async () => {
  12.           try {
  13.             console.log("开始调用云函数..."); // 确认点击事件触发
  14.             const result = await cloud.callFunction({
  15.               name: 'hello',
  16.               version: "$latest",
  17.               params: {}
  18.             });
  19.             console.log("云函数返回原始数据:", result); // 打印完整结果
  20.             if (result && result.getValue()) {
  21.               this.message = result.getValue().message;
  22.             } else {
  23.               this.message = "云函数未返回数据";
  24.             }
  25.           } catch (e) {
  26.             console.error("云函数调用失败:", e); // 打印详细错误
  27.             this.message = "调用失败: " + e.message;
  28.           }
  29.         })
  30.     }
  31.   }
  32. }
复制代码


  • version:版本($latest表现最新)。
  • 解释:端侧调用只能在 真机 和 模仿器上 运行,预览器不可行。
8.云函数(怎样传参)

重新编写云函数(例:Holle)
  1. // 定义一个异步处理函数,接收4个标准参数
  2. let myHandler = async function (event, context, callback, logger) {
  3.   // 1. 记录日志日志:打印完整的event对象(调试用)
  4.   logger.info(event);
  5.   // 2. 业务逻辑处理
  6.   // --------------------------------------------------
  7.   // 注意:event.body 是字符串格式,需要先解析为JSON对象
  8.   const obj = JSON.parse(event.body);  // 解析请求体
  9.   // 获取参数方式1:从解析后的对象中获取
  10.   const name = obj.name;  // 获取客户端传递的name参数
  11.   // 获取参数方式2(错误示例):直接访问会报错,因为event.body是字符串
  12.   // const name = event.body.name;  // ❌ 错误写法!
  13.   // --------------------------------------------------
  14.   // 3. 返回响应(通过callback)
  15.   callback({
  16.     code: 0,  // 自定义状态码(0表示成功)
  17.     message: `Hello ${name}`  // 返回拼接的问候语
  18.   });
  19. };
  20. // 导出处理函数(固定写法)
  21. export { myHandler };
复制代码
完成之后重新部署,云函数部署后如需更新触发器,需先删除旧配置再添加新配置。
(将agconnect-services.json重新在控制台下载,将从前的覆盖)
---------=============================================================
修改端侧调调用云函数代码

  1. import cloud from '@hw-agconnect/cloud'
  2. @Entry
  3. @Component
  4. struct Test{
  5.   @State message:string = '初始数据'
  6.   @State name:string = ''   // 定义变量name
  7.   build() {
  8.     Column(){
  9.       TextInput({placeholder:'请输入姓名'})
  10.         .onChange((value)=>{
  11.           this.name = value  // 获取用户输入的数据
  12.       })
  13.      //省略
  14.               name: 'hello',
  15.               version: "$latest",
  16.               params: {name:this.name} //将获取的数据
  17.      //省略
  18.   }
  19. }
复制代码
结果演示



留意事项



  • 云函数部署后如需更新触发器,需先删除旧配置再添加新配置。
  • 端侧与云侧包名必须一致,否则关联失败56。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表