uni-app 使用权限规则内的数据库查询get方法设置数据库的permission时,本地云函数和云端云函数表现不一致
uni-app 使用权限规则内的数据库查询get方法设置数据库的permission时,本地云函数和云端云函数表现不一致
示例代码:
db.collection('user-dancing').where({_id: 1}).update({
apply_status: 'approved'
}).then((res) => {
uni.showToast({
icon: 'success'
})
}).catch((err) => {
uni.showModal({
content: err.message || '请求服务失败',
showCancel: false
})
}).finally(() => {
uni.hideLoading()
})
操作步骤:
- 运行update函数
预期结果:
- 连接本地云函数,提示成功;
- 连接云端云函数,提示成功
实际结果:
- 连接本地云函数,提示成功;
- 连接云端云函数,提示 user-dancing[’.update’]:get方法内参数值必须唯一位置:31-67
bug描述:
我现在有这两张表
user-dancing:
{
"bsonType": "object",
"required": ["dancing-id"],
"permission": {
"read": true,
"create": "auth.uid != null",
"update": "doc.user_id == auth.uid || get(`database.dancing.${get(`database.user-dancing.${doc._id}`).dancing_id}`).ownerId == auth.uid",
"delete": "doc.user_id == auth.uid"
},
"properties": {
"_id": {
"description": "user-dancing关系 ID,系统自动生成"
},
"dancing_id": {
"bsonType": "string",
"description": "",
"foreignKey": "dancing._id"
}
},
"version": "0.0.2"
}
dancing:
{
"bsonType": "object",
"description": "",
"required": [
"ownerId"
],
"permission": {
"read": true,
"create": true,
"update": true,
"delete": false
},
"properties": {
"_id": {
"description": ""
},
"ownerId": {
"bsonType": "string",
"description": "发布人用户 id,参考`uni-id-users`表",
"foreignKey": "uni-id-users._id",
"forceDefaultValue": {
"$env": "uid"
}
}
},
"version": "0.0.3"
}
在使用update更改user-dancing表中数据的时候,本地云函数可以正常更改,云端云函数提示 user-dancing[’.update’]:get方法内参数值必须唯一位置:31-67
1 回复
在使用 uni-app
进行开发时,特别是在涉及到数据库查询和权限设置时,本地云函数和云端云函数的表现可能会有所不同。以下是一些可能导致这种不一致的原因以及解决方法:
1. 权限规则配置
- 本地云函数:本地云函数在运行时可能会忽略或部分忽略云端数据库的权限规则。这是因为本地环境通常是为了开发调试方便,可能会放宽一些权限限制。
- 云端云函数:云端云函数会严格遵守数据库的权限规则。如果权限规则配置不当,可能会导致查询失败或返回空数据。
2. 环境变量
- 本地云函数:本地云函数可能没有正确加载云端的环境变量,导致权限规则无法正确应用。
- 云端云函数:云端云函数会自动加载正确的环境变量,确保权限规则能够正确应用。
3. 数据库查询方法
- 本地云函数:在本地调试时,可能会使用一些临时的数据库查询方法,这些方法在云端可能不可用或不推荐使用。
- 云端云函数:云端云函数会使用标准的数据库查询方法,确保查询的稳定性和安全性。
4. 调试和日志
- 本地云函数:本地调试时,可能会缺少一些关键的日志信息,导致难以发现权限规则的问题。
- 云端云函数:云端云函数通常会提供更详细的日志信息,帮助开发者定位问题。
5. 解决方案
- 检查权限规则:确保数据库的权限规则配置正确,尤其是在云端环境下。
- 统一环境变量:确保本地和云端的环境变量一致,避免因环境变量不同导致的权限问题。
- 使用标准查询方法:在本地和云端都使用标准的数据库查询方法,确保一致性。
- 详细日志:在本地和云端都开启详细的日志记录,帮助发现和解决问题。
- 模拟云端环境:在本地开发时,尽量模拟云端环境,包括权限规则和环境变量,以减少差异。
6. 代码示例
以下是一个简单的示例,展示如何在本地和云端都使用一致的数据库查询方法:
// 云函数代码
exports.main = async (event, context) => {
const db = uniCloud.database();
const collection = db.collection('your-collection-name');
// 使用一致的查询方法
const res = await collection.where({
// 查询条件
}).get();
return {
data: res.data
};
};