You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用JavaScript查询MongoDB返回空数组的问题求助

解决MongoDB Stitch查询返回空数组的问题

我来帮你排查下这个问题,你遇到的情况很常见,大概率是权限或者异步流程的问题,咱们一步步来梳理:

1. 优先检查Stitch应用的数据库权限

这是最容易忽略也是最常见的原因!匿名用户默认没有读取集合的权限,你需要登录MongoDB Atlas做以下操作:

  • 找到你的Stitch应用twebh-rufmj
  • 进入Rules(规则)页面,定位到forums.posts集合的权限规则
  • 确保匿名用户拥有read权限,比如可以设置最简单的规则:
    {
      "read": true,
      "write": false
    }
    
    保存规则后再重新测试你的代码。

2. 修复异步流程的顺序问题

你当前的代码中,loginWithCredential的catch会在登录出错后返回一个resolved状态的Promise,导致即使登录失败,后续的displayEmployees还是会执行(此时用户未授权,自然查不到数据)。调整代码结构,确保只有登录成功后才执行查询:

client.auth
  .loginWithCredential(new stitch.AnonymousCredential())
  .then(() => displayEmployees()) // 登录成功后才调用查询
  .catch(err => { console.error("登录失败:", err); });

3. 验证集合与数据库名称的大小写匹配

MongoDB的集合和数据库名称是区分大小写的!确认Atlas中你的数据库确实叫forums,集合确实是posts——如果集合是Posts(首字母大写),你的查询就会返回空数组。

4. 添加查询错误捕获,排查隐藏问题

现在的查询只处理了成功的情况,没有捕获错误,添加catch可以帮你发现隐藏的问题(比如权限不足、集合不存在等):

function displayEmployees() {
  db.collection("posts")
    .find({}, { limit: 1000 })
    .toArray()
    .then(docs => {
      console.log("查询到的文档数量:", docs.length); // 先在控制台打印数量,确认是否有数据
      const html = docs.map(doc => `<div>${doc.topic}</div>`);
      document.getElementById("comments").innerHTML = html;
    })
    .catch(err => {
      console.error("查询过程出错:", err); // 捕获并打印查询错误
    });
}

5. 确保Stitch客户端完全初始化后再操作

有时候客户端初始化还没完成就执行了登录和查询,导致无法正常连接。可以改成等待初始化完成后再执行后续逻辑:

stitch.Stitch.initializeDefaultAppClient("twebh-rufmj")
  .then(client => {
    const db = client.getServiceClient(stitch.RemoteMongoClient.factory, "mongodb-atlas").db("forums");
    client.auth
      .loginWithCredential(new stitch.AnonymousCredential())
      .then(() => {
        // 登录成功后执行查询
        db.collection("posts").find({}, { limit: 1000 }).toArray()
          .then(docs => {
            console.log("查询结果:", docs);
            const html = docs.map(doc => `<div>${doc.topic}</div>`);
            document.getElementById("comments").innerHTML = html;
          })
          .catch(err => console.error("查询错误:", err));
      })
      .catch(err => console.error("登录错误:", err));
  })
  .catch(err => console.error("客户端初始化错误:", err));

按照这个顺序排查,先解决权限问题,再检查代码逻辑,应该就能查到数据了。

内容的提问来源于stack exchange,提问作者user3459555

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:41:29