uni-app 使用权限规则内的数据库查询get方法设置数据库的permission时,本地云函数和云端云函数表现不一致

发布于 1周前 作者 ionicwang 来自 Uni-App

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
  };
};
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!