harmonyos next 中端云一体化开发相关

需求如下: 

agc 的云函数 如和实现 对于 云数据库 ,云存储的操作 

比如 

调用云函数 实现将数据存储到云数据库 

调用云函数 实现 文件存储到云存储中 

云存储中的文件 与 云数据库中的数据如何关联等


基本上就是 CRUD  系列操作 


harmonyos next
2025-08-13 09:44:40
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
hm688c71b97af4c

HarmonyOS Next 中使用 AGC 云函数操作云数据库与云存储

在 HarmonyOS Next 中,通过 AGC(AppGallery Connect)的云函数可以方便地实现对云数据库和云存储的操作,实现端云一体化开发。下面我将详细介绍相关实现方法。

1. 环境准备

首先需要在 AGC 控制台完成以下配置:

  • 启用云函数、云数据库和云存储服务
  • 创建云函数
  • 配置数据库集合和存储桶权限

2. 云函数操作云数据库(CRUD)

下面是云函数中操作云数据库的示例代码:

// 引入云数据库模块
const db = context.database();
const collection = db.collection('userData');

// 新增数据
exports.createData = async (event, context) => {
  try {
    // 从事件中获取要插入的数据
    const data = event.data;
    
    // 插入数据到云数据库
    const result = await collection.add(data);
    
    return {
      code: 0,
      message: '数据添加成功',
      data: result
    };
  } catch (error) {
    return {
      code: -1,
      message: '数据添加失败',
      error: error.message
    };
  }
};

// 查询数据
exports.queryData = async (event, context) => {
  try {
    // 从事件中获取查询条件
    const condition = event.condition || {};
    
    // 执行查询
    const result = await collection.where(condition).get();
    
    return {
      code: 0,
      message: '数据查询成功',
      data: result
    };
  } catch (error) {
    return {
      code: -1,
      message: '数据查询失败',
      error: error.message
    };
  }
};

// 更新数据
exports.updateData = async (event, context) => {
  try {
    // 获取条件和更新数据
    const { id, updateData } = event;
    
    // 执行更新
    const result = await collection.doc(id).update(updateData);
    
    return {
      code: 0,
      message: '数据更新成功',
      data: result
    };
  } catch (error) {
    return {
      code: -1,
      message: '数据更新失败',
      error: error.message
    };
  }
};

// 删除数据
exports.deleteData = async (event, context) => {
  try {
    // 获取要删除的文档ID
    const { id } = event;
    
    // 执行删除
    const result = await collection.doc(id).remove();
    
    return {
      code: 0,
      message: '数据删除成功',
      data: result
    };
  } catch (error) {
    return {
      code: -1,
      message: '数据删除失败',
      error: error.message
    };
  }
};

3. 云函数操作云存储

以下是云函数中操作云存储的示例:

// 引入云存储模块
const storage = context.storage();

// 上传文件到云存储
exports.uploadFile = async (event, context) => {
  try {
    // 获取文件信息和内容
    const { fileName, fileContent, mimeType } = event;
    
    // 定义存储路径
    const filePath = `uploads/${Date.now()}_${fileName}`;
    
    // 上传文件
    const result = await storage.uploadFile({
      cloudPath: filePath,
      content: Buffer.from(fileContent, 'base64'),
      contentType: mimeType
    });
    
    // 返回文件URL和路径
    return {
      code: 0,
      message: '文件上传成功',
      data: {
        fileId: result.fileID,
        url: result.downloadURL,
        path: filePath
      }
    };
  } catch (error) {
    return {
      code: -1,
      message: '文件上传失败',
      error: error.message
    };
  }
};

// 删除云存储中的文件
exports.deleteFile = async (event, context) => {
  try {
    // 获取要删除的文件ID
    const { fileId } = event;
    
    // 执行删除
    await storage.deleteFile({
      fileList: [fileId]
    });
    
    return {
      code: 0,
      message: '文件删除成功'
    };
  } catch (error) {
    return {
      code: -1,
      message: '文件删除失败',
      error: error.message
    };
  }
};

// 获取文件下载URL
exports.getFileUrl = async (event, context) => {
  try {
    const { fileId } = event;
    
    // 获取临时下载URL
    const result = await storage.getTempFileURL({
      fileList: [fileId]
    });
    
    return {
      code: 0,
      message: '获取文件URL成功',
      data: {
        url: result.fileList[0].tempFileURL
      }
    };
  } catch (error) {
    return {
      code: -1,
      message: '获取文件URL失败',
      error: error.message
    };
  }
};

4. 云存储与云数据库的关联

通常通过在云数据库中存储文件的标识信息(如fileId或URL)来关联云存储文件和数据库数据:

// 引入所需模块
const db = context.database();
const storage = context.storage();
const collection = db.collection('userPosts');

// 上传文件并关联到数据库记录
exports.uploadAndSave = async (event, context) => {
  try {
    // 1. 先上传文件到云存储
    const { fileName, fileContent, mimeType, postData } = event;
    const filePath = `posts/${Date.now()}_${fileName}`;
    
    const uploadResult = await storage.uploadFile({
      cloudPath: filePath,
      content: Buffer.from(fileContent, 'base64'),
      contentType: mimeType
    });
    
    // 2. 将文件信息与其他数据一起保存到数据库
    const post = {
      ...postData,
      image: {
        fileId: uploadResult.fileID,
        url: uploadResult.downloadURL,
        name: fileName,
        size: uploadResult.size,
        uploadedAt: new Date()
      }
    };
    
    const dbResult = await collection.add(post);
    
    return {
      code: 0,
      message: '文件上传并保存数据成功',
      data: {
        postId: dbResult.id,
        fileId: uploadResult.fileID
      }
    };
  } catch (error) {
    return {
      code: -1,
      message: '操作失败',
      error: error.message
    };
  }
};

// 删除数据时同时删除关联的文件
exports.deletePostAndFile = async (event, context) => {
  try {
    const { postId } = event;
    
    // 1. 先查询帖子信息获取文件ID
    const post = await collection.doc(postId).get();
    if (!post.data || !post.data.image) {
      return {
        code: -1,
        message: '帖子不存在或没有关联文件'
      };
    }
    
    // 2. 删除云存储中的文件
    await storage.deleteFile({
      fileList: [post.data.image.fileId]
    });
    
    // 3. 删除数据库中的帖子记录
    await collection.doc(postId).remove();
    
    return {
      code: 0,
      message: '帖子及关联文件删除成功'
    };
  } catch (error) {
    return {
      code: -1,
      message: '删除失败',
      error: error.message
    };
  }
};

5. HarmonyOS Next 端调用云函数

在 HarmonyOS Next 应用端,调用云函数的代码示例:

import agconnect from '@hw-agconnect/api-ohos';
import '@hw-agconnect/function-ohos';

export class CloudFunctionService {
  // 初始化AGC
  initAGC(context: Context) {
    agconnect.instance().init(context);
  }
  
  // 调用创建数据的云函数
  async createData(data: any): Promise<any> {
    try {
      const functionCallable = agconnect.function().wrap('createData');
      const result = await functionCallable.call({ data });
      return result.getValue();
    } catch (error) {
      console.error('调用云函数失败:', error);
      throw error;
    }
  }
  
  // 调用上传文件的云函数
  async uploadFile(fileName: string, fileContent: Uint8Array, mimeType: string, postData: any): Promise<any> {
    try {
      // 将文件内容转换为base64
      const base64Content = this.arrayBufferToBase64(fileContent.buffer);
      
      const functionCallable = agconnect.function().wrap('uploadAndSave');
      const result = await functionCallable.call({
        fileName,
        fileContent: base64Content,
        mimeType,
        postData
      });
      
      return result.getValue();
    } catch (error) {
      console.error('上传文件失败:', error);
      throw error;
    }
  }
  
  // ArrayBuffer转Base64
  private arrayBufferToBase64(buffer: ArrayBuffer): string {
    let binary = '';
    const bytes = new Uint8Array(buffer);
    const len = bytes.byteLength;
    
    for (let i = 0; i < len; i++) {
      binary += String.fromCharCode(bytes[i]);
    }
    
    return btoa(binary);
  }
}

通过以上方法,你可以实现:

  1. 利用云函数对云数据库进行完整的CRUD操作
  2. 通过云函数管理云存储中的文件(上传、删除、获取URL)
  3. 在云数据库中存储文件的元数据(fileId、URL等)实现数据关联
  4. 在HarmonyOS Next应用端方便地调用这些云函数
分享
微博
QQ
微信
回复
2025-08-15 14:10:47
相关问题
一体化开发的安全挑战
776浏览 • 0回复 待解决
一体数据库权限问题
878浏览 • 1回复 已解决
一体化,本地数据库和数据库
627浏览 • 1回复 待解决
#鸿蒙学习大百科#什么是IDE一体化?
1582浏览 • 1回复 待解决
怎么样与AGC数据库同步
1720浏览 • 1回复 待解决
在 ArkTS 如何进行模块化开发?
1609浏览 • 1回复 待解决
HarmonyOS 有没有模块化开发模板
1619浏览 • 1回复 待解决
开发 手表和ipad怎么适配的
600浏览 • 0回复 待解决
华为智能家居相关问题
13088浏览 • 3回复 已解决
设备同步及相关问题
10883浏览 • 3回复 待解决
鸿蒙hap包是否支持插件化开发
9203浏览 • 1回复 待解决