小程序云开发-通用更新函数记录
在开发过程中如果执行一个集合(collection)的更新操作就新建一个云函数,这样会创建一堆功能类似的函数,不仅增加代码量也不便于维护。
基于自己在开发中遇到的问题整理出来记录。因为我在开发中最开始在使用到命令(Command)的时候是直接先定义命令然后直接传值,经过测试发现不能达到预想的结果,后面请教技术牛人得以解决。下面代码中eval()函数用来将调用时传的命令字符串进行转化,代码中所有牵扯到命令的条件和数据参数名都以 “_eval”结尾以便处理。
下面就对函数的封装和调用进行详细的展示
// cloud_update 云函数调用
wx.cloud.callFunction({
name: "cloud_update",
data: {
collection: "collectionxxx", // 需要修改的集合
data: { // 需要更新的数据(普通传递-没有使用到命令)
field1: "xxx", //
field2: "xxx"
},
data_eval: { // 使用到命令时的需要更新数据传递命名
field3: "_command.inc(1)" // 使用命令,在原有的基础上进行+1
},
where: { // 没有用到命令时的条件语句命名
_id: 1
}
},
success: function() {
wx.navigateBack()
}
})
--------------------------------------下面是云函数cloud_update-----------------------------------------------
// 云函数入口文件 (函数名称:cloud_update)
const cloud = require('wx-server-sdk')
cloud.init()
const db = cloud.database();
const _command = db.command;
// 云函数入口函数
exports.main = async (event, context) => {
const wxContext = cloud.getWXContext();
var obj = event.obj ? event.obj : {}; // 当更新的数据或者条件中涉及到对象的时候才会传递和使用这个参数
event.data=event.data?event.data :{};
event.where=event.where ? event.where : {}
// 替换data中的Command命令
if (event.data_eval) {
for (item in event.data_eval) {
event.data[item] = eval(event.data_eval[item]);
}
}
// 替换where中的Command命令
if (event.where_eval) {
for (item in event.where_eval) {
event.where[item] = eval(event.data_eval[item]);
}
}
// 获取对象
var db_obj = db.collection(event.collection);
// 执行Where
if (event.where) {
db_obj = db_obj.where(event.where);
}
// 更新数据
try {
return await db_obj.update({data : event.data});
}
catch (e) {
return [e, event];
}
}