Tch
Tch
Published on 2022-12-25 / 42 Visits
0
0

LeanCloud数据存储实现小程序云开发

1. LeanCloud

https://www.leancloud.cn/storage/

2. LeanCloud选择原因

微信小程序的开发包括上线需要一个备案过的域名,而域名备案又需要一个服务器(仅腾讯云而言)。而微信云开发作为个人开发者受限于费用也不做考虑。

此时不考虑复杂的业务逻辑数据库读取是后端服务唯一的需求。经过一番搜索就发现了LeanCloud的数据存储很不错。

3. 初步了解

 数据存储中有个结构化数据,对应的一个概念就是Class(类似于关系型数据库中表)。

和建表是比较相像的,稍微摸索就会操作。

4. 准备工作

https://leancloud.cn/docs/sdk_setup-js.html

5. 对象操作

https://leancloud.cn/docs/leanstorage_guide-js.html#hash765832

这里的对象就是上面介绍过的Class,创建了一个对象之后就要有一些操作。

包括常规的数据库的增删查改。官网都是有示例的,如下图。

详情在传送门可以看到,就不过多赘述。

6. 对象操作的二次封装

看过官网的示例就会发现数据操作在开发中是不能直接使用的,做一些简单的封装也是必要的。

以下附上我封装的方法,供参考(比较简单应该都能看懂,就只贴代码了)。

6.1 新增(保存)

// 封装leancloud保存对象的方法
const AV = require("../libs/av-core-min")
const Result = require("./result")
 
/**
 * 保存对象(重复数据不会覆盖)
 * @param {*} clazz 表名
 * @param {*} obj 保存对象的 k,v  
            * const obj = {
                key: 'name',
                value: '四宝'
              }
 */
const save = (clazz, obj) => {
  // 声明class
  const Clazz = AV.Object.extend(clazz)
  // 构建对象
  const cla = new Clazz();
  // 为属性赋值
  cla.set(obj.key, obj.value)
  // 将对象保存到云端
  cla.save().then((res) => {
    // 保存成功
    Result.ok()
  }, (err) => {
    // 异常处理
    Result.err(err)
  })
}
 
/**
 * 批量保存对象(重复数据不会覆盖)
 * @param {*} clazz 表名
 * @param {*} objs 保存对象的 k,v  
            * const objs = [
            *   {
            *     key: 'name',
                  value: '四宝'
                },
                {
            *     key: 'name',
                  value: '五宝'
                },
              ]
 */
const saveAll = (clazz, objs) => {
  // 声明class
  const Clazz = AV.Object.extend(clazz)
  
  // 为属性赋值
  var objects = []
  objs.forEach(obj => {
    // 构建对象
    const cla = new Clazz();
    cla.set(obj.key, obj.value)
    objects.push(cla)
  });
  console.log("saveAll, ", objects)
  // 批量更新
  AV.Object.saveAll(objects).then((res) => {
    // 保存成功
    Result.ok()
  }, (err) => {
    // 异常处理
    Result.err(err)
  })
}
 
 
module.exports = {
  save: save,
  saveAll: saveAll
}

6.2 查询

// 封装leancloud查询对象的方法
const AV = require("../libs/av-core-min")
const Result = require("./result")

/**
 * 查询对象
 * @param {*} clazz 表名
 * @param {*} objectId objectId
 */
const query = (clazz, objectId) => {
  const Clazz = new AV.Query(clazz)
  Clazz.get(objectId).then((res) => {
    // 查询成功
    console.log(res)
  }, (err) => {
    // 查询失败
    console.err(err)
  })
}

/**
 * 查询对象
 * @param {*} clazz 表名
 * @param {*} conditions 条件
            * const conditions = {
                key: 'name',
                value: '四宝'
              }
 */
const queryByCondition = (clazz, conditions) => {
  const Clazz = new AV.Query(clazz)
  Clazz.equalTo(conditions.key, conditions.value)
  Clazz.find().then((res) => {
    // 查询成功
    console.log(res)
  }, (err) => {
    // 查询失败
    console.err(err)
  })
}

module.exports = {
  query: query,
  queryByCondition: queryByCondition
}

6.3  修改

// 封装leancloud更新对象的方法
const AV = require("../libs/av-core-min")
const Result = require("./result")

/**
 * 更新对象
 * @param {*} clazz 表名
 * @param {*} objs 保存对象的 k,v  
            * const objs = [
            *   {
            *     key: 'name',
                  value: '四宝'
                },
                {
            *     key: 'name',
                  value: '五宝'
                },
              ]
 * @param {*} objectid objectid
 */
const update = (clazz, objs, objectid) => {
  const Clazz = AV.Object.createWithoutData(clazz, objectid);
  // 为属性赋值
  var objects = []
  objs.forEach(obj => {
    // 构建对象
    Clazz.set(obj.key, obj.value)
    objects.push(Clazz)
  });

  AV.Object.saveAll(objects).then((res) => {
    // 保存成功
    Result.ok()
  }, (err) => {
    // 异常处理
    Result.err(err)
  })
}

module.exports = {
  update: update
}

6.4 删除

// 封装leancloud删除对象的方法
const AV = require("../libs/av-core-min")
const Result = require("./result")

/**
 * 删除对象
 * @param {*} clazz 表名
 * @param {*} objectid objectid
 */
const destroy = (clazz, objectid) => {
  const Clazz = AV.Object.createWithoutData(clazz, objectid);
  Clazz.destroy().then((res) => {
    // 删除成功
    Result.ok()
  }, (err) => {
    // 删除处理
    Result.err(err)
  })
}

/**
 * 批量删除对象
 * @param {*} clazz 表名
 * @param {*} objectids objectids
 */
const destroyAll = (clazz, objectids) => {

  var objects = []
  objectids.forEach(objectid => {
    const Clazz = AV.Object.createWithoutData(clazz, objectid);
    objects.push(Clazz)
  });
  
  // 批量删除
  AV.Object.destroyAll(objects).then(
    function (res) {
      // 成功删除所有对象时进入此 resolve 函数,deletedObjects 是包含所有的 AV.Object 的数组
      Result.ok()
    },
    function (err) {
      // 只要有一个对象删除错误就会进入此 reject 函数
      Result.err(err)
    }
  );
}

module.exports = {
  destroy: destroy,
  destroyAll: destroyAll
}

6.5 Result

所有对象操作的结果都放到一个Result中了,包括数据对象的返回和成功/失败的消息提示。还没想好怎么去做就等用到的时候再去修改吧。

7. 写在最后

LeanCloud确实是个很不错的产品,对于个人开发者而言免费的功能和规格其实已经够用了。

我用到的包括云引擎都挺不错的,还有更多功能有待探索。


Comment