1. LeanCloud
2. LeanCloud选择原因
微信小程序的开发包括上线需要一个备案过的域名,而域名备案又需要一个服务器(仅腾讯云而言)。而微信云开发作为个人开发者受限于费用也不做考虑。
此时不考虑复杂的业务逻辑数据库读取是后端服务唯一的需求。经过一番搜索就发现了LeanCloud的数据存储很不错。
3. 初步了解
数据存储中有个结构化数据,对应的一个概念就是Class(类似于关系型数据库中表)。
和建表是比较相像的,稍微摸索就会操作。
4. 准备工作
5. 对象操作
这里的对象就是上面介绍过的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确实是个很不错的产品,对于个人开发者而言免费的功能和规格其实已经够用了。
我用到的包括云引擎都挺不错的,还有更多功能有待探索。