出于权限、数据查询条数限制、数据库安全等考虑,寡人一直都只通过云函数对数据库进行增查改操作。也就是在前端把data、where等条件传到云函数完成操作。
问题来了,前端到后端的无法直接传递db.command这种数据。
一开始我想到一个折衷的方法,前端这样写:
val1: 'command="thisIsOpenid"'
val2: 'command=db.serverDate()'
val3: 'command=new Date(new Date("1984-09-03 18:19:08").setHours(firstDate.getHours() - 8))'
后端再递归遍历过来(这种情况下Key与val的层次比较正常):
// 递归遍历并替换指定值
async function funForIn(data, OPENID) {
for (let i in data) {
if (typeof data[i] == 'object') {
funForIn(data[i])
} else {
// 替换OPENID
if (String(data[i]).includes('thisIsOpenid')) {
data[i] = data[i].replace(/thisIsOpenid/g, OPENID)
}
if (String(data[i]).slice(0, 8) == 'command=') {
// 查询指令
data[i] = eval(data[i].slice(8))
} else if (String(data[i]).slice(0, 7) == 'regExp=') {
// 正则Get
data[i] = db.RegExp({
regexp: String(data[i].slice(7)),
options: 'i',
})
}
}
}
}
基本上可以解决大部分的需求,但问题来了,对于Key与val层次另类的,类似这种,就无能为力了。
db.collection('todo').where(_.or([
{
progress: _.gt(80)
},
{
done: true
}
]))
所以,为了实现前端向后端传db.command条件,各位大佬有什么好的办法?谢谢。
没有办法。
传参数,在云函数里重新构建_.xxx吧
前端传代码字符串,后端eval('代码')执行,不过可能安全性不太好