uni-app 本地环境下JQL查询云数据库与传统MongoDB写法查询同样数据,传统MongoDB写法出现权限问题而JQL不会

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

uni-app 本地环境下JQL查询云数据库与传统MongoDB写法查询同样数据,传统MongoDB写法出现权限问题而JQL不会

开发环境 版本号 项目创建方式
客户端
云对象

示例代码:

//下面写法在客户端调用报错,在云对象中调用不报错  
const result = await db  
        .collection("store")  
        .aggregate()  
        .match({ _id: sid.value })  
        .project({ _id: true })  
        .end();  
//下面写法不报错  
const result = await db.collection("store").where({_id:sid.value}).field("_id").get()

操作步骤:

在客户端中使用下面代码会出现权限错误:

const result = await db  
        .collection("store")  
        .aggregate()  
        .match({ _id: sid.value })  
        .project({ _id: true })  
        .end();

预期结果:

在客户端中使用下面代码正常获得数据:

const result = await db  
        .collection("store")  
        .aggregate()  
        .match({ _id: sid.value })  
        .project({ _id: true })  
        .end();

实际结果:

出现权限错误

bug描述:

同样在本地环境下,使用JQL查询云数据库跟使用传统MongoDB写法查询同样的数据,传统MongoDB写法出现权限问题,而JQL写法不会;且云数据库中没有的read为true


5 回复

客户端只有JQL语法,也一定会走权限校验。你贴一下store表的权限配置,注意看某个字段上是不是有权限配置


我只查询_id,而它是系动统自生成,没有添加权限配置,而且主要问题是jql语法没有出现权限问题,传统MongoDB写法出现权限问题

回复 1***@163.com: “客户端只有JQL语法”

回复 1***@163.com: 客户端无论你是写uniCloud.database还是uniCloud.databaseForJQL都是jql语法,都会校验权限

在使用 uni-app 开发时,JQL(JSON Query Language)是一种专为 uniCloud 设计的查询语言,它封装了与云数据库的交互逻辑,简化了开发者的操作。JQL 与传统 MongoDB 查询语法类似,但它们在权限控制和执行环境上有一些关键区别,这可能导致在本地环境下使用传统 MongoDB 写法时出现权限问题,而 JQL 不会。

1. 权限控制的区别

  • JQL:JQL 查询在执行时会自动应用 uniCloud 的权限规则。uniCloud 提供了基于角色和权限的访问控制机制,JQL 会根据当前用户的身份(如登录状态、用户角色等)自动过滤数据,确保用户只能访问其有权限的数据。

  • 传统 MongoDB 写法:在本地环境下,如果你直接使用 MongoDB 的查询语法,权限控制需要开发者手动实现。如果未正确设置权限规则,可能会导致用户访问到未经授权的数据,从而引发权限问题。

2. 执行环境的区别

  • JQL:JQL 查询是在 uniCloud 的云函数环境中执行的,云函数会自动处理与数据库的连接、权限验证等操作。开发者无需关心底层的数据库连接和权限管理。

  • 传统 MongoDB 写法:在本地环境下,如果你直接使用 MongoDB 查询语法,通常需要手动连接到 MongoDB 数据库,并且在查询时可能需要手动处理权限验证。如果权限验证没有正确实现,就会导致权限问题。

3. 如何解决传统 MongoDB 写法中的权限问题

如果你在本地环境下使用传统 MongoDB 写法时遇到权限问题,可以考虑以下解决方案:

  • 手动实现权限控制:在查询前,手动检查用户的权限,并根据权限过滤数据。
  • 使用 uniCloud 的云函数:将传统的 MongoDB 查询逻辑迁移到 uniCloud 的云函数中,利用 uniCloud 的权限控制机制来管理数据访问。
  • 切换到 JQL:如果可能,尽量使用 JQL 进行数据查询,这样可以减少权限管理的复杂性,并确保数据访问的安全性。

4. 示例对比

假设我们有一个 users 集合,我们希望查询当前登录用户的信息。

使用 JQL 查询:

const db = uniCloud.database();
const res = await db.collection('users').where({
  _id: uniCloud.getCurrentUserInfo().uid
}).get();

使用传统 MongoDB 查询:

const MongoClient = require('mongodb').MongoClient;
const url = 'mongodb://localhost:27017';
const dbName = 'your-database';

MongoClient.connect(url, function(err, client) {
  if (err) throw err;
  const db = client.db(dbName);
  const collection = db.collection('users');
  collection.find({ _id: 'current-user-id' }).toArray(function(err, docs) {
    if (err) throw err;
    console.log(docs);
    client.close();
  });
});
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!