涉及数据库,往往就离不开权限问题,在微信小程序中也一样,为此还吃了不少亏。现在就记录一下在实践后的关于这方面的总结吧!
一、解决读不出来的问题–基本设置–读的权限
问题: 如果发现在使用where-get、doc-get等操作时,函数运行成功,没有任何报错,逻辑也没问题,但是要显示的结果就是出不来,一片空白,这时候很可能就是权限没弄好。
这里先谈读的权限问题,因为读的权限比较方便,通过在云数据库后台就可以实现。无需用到云函数
很多时候读取不出来就是因为将数据库权限设为仅创建者可以读写,如上图中。这样就会出现有时候可以读,有时候又不可以读的神奇情况,调试起来特别费时间。想要解决,只需选第一个。
比如笔者没有租服务器,就用云开发模拟一个聊天室,但是在读取以往信息的时候就总是只能读取自己创建的聊天室的内容,读取不了别人创建的聊天室内容,致使实现不了相应功能,后来才发现时权限没设置对
二、更新数据时执行成功但是数据没有改变–写的权限
问题:
使用数据库的update操作时发现函数执行成功,逻辑也没问题,但是就是无法更新数据,很大可能是因为涉及到更新的记录是别人创建的,你没有写的权限。
遇到这种问题就可以使用微信提供的云函数。因为云函数可以实现跨权限修改数据库内容。这里就记录一下云函数的使用和注意事项。
** 1、配置**
在project.config.json文件中添加
"cloudfunctionRoot": "cloudfunctions/",
其中“cloudfunctionRoot”是固定的,代表云函数的根目录,后面的则根目录的文件夹名称,是自定义的,但是要在目录中创建对应名称的文件夹或是使用已有的文件夹。
这个文件夹就是放云函数的文件夹,新建、修改云函数内容,都需要在这里弄。
2、初始化-引入云开发
在app.js页面的App({})中添加如下代码
onLaunch: function () {
if(!wx.cloud){
console.log("请使用更高级的基础库以便使用云能力")
}else{
wx.cloud.init({
env: "",//一定不能有空格等
traceUser:true,
})
console.log("你好,初始化成功")
}
},
上述操作的目的是为了在小程序初次载入onLaunch的时候启动云开发(wx.cloud.init)。在env后填上对应的环境名,环境名一般是你在申请云开发时设置的,也可以在下图中红色框框里查看。这个很重要,在使用云函数的时候可能也要用到。
3、新建文件–在云函数根目录下新建Node.js云函数
在第1步中指定的文件夹中(如果指定的文件夹一开始还没创建或者没有的化,要先创建),右键选择“新建Node.js云函数”来建立一个新的文件。
新建的云函数目录的内容如下图
这时我们就可以在index.js页面书写我们的代码了
4、开始代码实现
// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init()
// 云函数入口函数
exports.main = async (event, context) => {
const wxContext = cloud.getWXContext()
return {
event,
openid: wxContext.OPENID,
appid: wxContext.APPID,
unionid: wxContext.UNIONID,
}
}
在cloud.init()中最好加入自己的环境,虽然官方文档说没有写会调用默认的环境但是我一开始使用的时候,不加就不行
cloud.init({
env: "你的环境"
})
若要实现数据库操作,可以
try {
return await db.collection('数据库对应的表名').where({
data: event.XXX,
}).update({ // data 传入需要局部更新的数据
data: {
info:event.XXX,
}
})
} catch (e) {
console.error(e)
}
5、上传云函数
至关重要的一点,在写完代码后一定要记得上传云函数
选定云函数文件夹,右键点击上传并部署(这时会出现两个上传并部署,一般选择云端安装依赖)
如果你写完云函数,执行的时候发现没有报错,但是并没有实现想要的功能就很有可能就是忘记上传了,这个调试是很难调出来的,所以一定要注意。
重要的事情说三遍:写完记得上传,上传,上传!!!
6、使用-调用云函数
wx.cloud.callFunction({ // 要调用的云函数名称
name: '想要调用的云函数名', // 传递给云函数的event参数
data: {
info:information
},
success: res => {
console.log("云函数调用成功", res)
},
fail: err => {
console.error("云函数调用失败", err)
},
})
```