node.js - 尝试获取所有文档时,Firebase 数据库集合返回空数组

标签 node.js firebase google-cloud-firestore google-cloud-functions

我试图从我的数据库集合“posts”中获取所有文档,但我得到的是一个空数组。

奇怪的是,我能够从另一个名为“users”的集合中获取所有文档,该集合具有相同的结构并使用完全相同的代码。

我花了几天时间寻找答案,但一直找不到解决方案。

这是请求:

const db = admin.firestore();

exports.getAllPosts = (req, res) => {

 db.collection('posts')
.orderBy('createdAt', 'desc')
.get()
.then(snapshot => {  
   let posts = [];
   snapshot.forEach((doc) => {
     posts.push({
       id: doc.id,
       body: doc.data().body,
       author: doc.data().author,
       createdAt: doc.data().timestamp,
       voteScore: doc.data().voteScore
     });
   });
  return res.json(posts);
})
.catch(err => {
  console.error(err);
  res.status(500).json({ error: err.code });
});
}

这是响应:

[]

这就是我当前的收藏: Posts collection screenshot

这是我返回“快照”时得到的响应:

{
"_query": {
    "_firestore": {
        "_settings": {
            "projectId": "readable-bf7a6",
            "firebaseVersion": "9.6.0",
            "libName": "gccl",
            "libVersion": "4.10.0 fire/9.6.0"
        },
        "_settingsFrozen": true,
        "_serializer": {
            "allowUndefined": false
        },
        "_projectId": "readable-bf7a6",
        "registeredListenersCount": 0,
        "bulkWritersCount": 0,
        "_backoffSettings": {
            "initialDelayMs": 100,
            "maxDelayMs": 60000,
            "backoffFactor": 1.3
        },
        "_clientPool": {
            "concurrentOperationLimit": 100,
            "maxIdleClients": 1,
            "activeClients": {},
            "failedClients": {},
            "terminated": false,
            "terminateDeferred": {
                "promise": {}
            }
        }
    },
    "_queryOptions": {
        "parentPath": {
            "segments": []
        },
        "collectionId": "posts",
        "converter": {},
        "allDescendants": false,
        "fieldFilters": [],
        "fieldOrders": [
            {
                "field": {
                    "segments": [
                        "createdAt"
                    ]
                },
                "direction": "DESCENDING"
            }
        ],
        "kindless": false
    },
    "_serializer": {
        "allowUndefined": false
    },
    "_allowUndefined": false
},
"_readTime": {
    "_seconds": 1622395245,
    "_nanoseconds": 513743000
},
"_size": 0,
"_materializedDocs": null,
"_materializedChanges": null
}

注意集合“users”的请求如何成功运行:

const db = admin.firestore();

exports.getAllUsers = (req, res) => {

 db.collection('users')
.orderBy('createdAt', 'desc')
.get()
.then(snapshot => {  
   let users = [];
   snapshot.forEach((doc) => {
     let users = [];
     snapshot.forEach((doc) => {
      users.push({
        id: doc.data().userId,
        email: doc.data().email,
        handle: doc.data().handle
     });
   });
  return res.json(users);
})
.catch(err => {
  console.error(err);
  res.status(500).json({ error: err.code });
});
}

响应:

[
{
    "id": "EPoHBxhQFUXbcL3TCVx1LdUG2nO2",
    "email": "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="5f2d2a3d3a311f38323e3633713c3032" rel="noreferrer noopener nofollow">[email protected]</a>"
},
{
    "id": "RqEa3dEq8TSDcZYeolXafju67rB2",
    "email": "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="b8cdcbddca8988f8dfd5d9d1d496dbd7d5" rel="noreferrer noopener nofollow">[email protected]</a>"
},
{
    "id": "dxveb4n2iMQej5Q14uprsKRxFp23",
    "email": "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="c0b5b3a5b2f480a7ada1a9aceea3afad" rel="noreferrer noopener nofollow">[email protected]</a>",
    "handle": "user4"
},
{
    "id": "YQPzBPcsqlVZk9iJEuZTHKUNuVG2",
    "email": "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="eb9e988e99d9ab8c868a8287c5888486" rel="noreferrer noopener nofollow">[email protected]</a>",
    "handle": "user2"
},
{
    "id": "CZ05BJxi3TUOpIrmBaz539OWlbC3",
    "email": "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="1a6f697f685a7d777b737634797577" rel="noreferrer noopener nofollow">[email protected]</a>",
    "handle": "user"
},
{
    "id": "t0t83BVwt4gVgJkDv7HL1r1MaKr1",
    "email": "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="74010711063e1b071146341319151d185a171b19" rel="noreferrer noopener nofollow">[email protected]</a>",
    "handle": "Jose"
}
]

Firebase 中的用户集合如下所示: Users collection screenshot

为什么一个集合会失败,而另一个集合工作正常并且我使用相同的代码?我在这里缺少什么?

提前致谢,希望我已经说得尽可能清楚了。如果您需要我提供其他任何信息,请告诉我。

最佳答案

非常简单,我的 friend ,你的 posts 文档不能这样排序:

.orderBy('createdAt', 'desc')

由于帖子文档没有 createdAt 属性,但它们有 timestamp 属性,因此您应该使用该属性来对帖子进行排序,如下所示:

.orderBy('timestamp', 'desc')

希望对您有帮助👍

关于node.js - 尝试获取所有文档时,Firebase 数据库集合返回空数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67764035/

相关文章:

android - 如何删除应用程序后台时出现的单个 fcm 通知?

dart - 如何将对象列表添加到 Firestore?

android - 从autocompletetextview onItemClickListener项目获取Firestore文档ID

firebase - "firebase serve"只是一个计划 Vanilla 开发服务器吗?

javascript - 带有 Firebase 的通知系统在每次重新加载时触发回调

javascript - EJS 和 Mongoosse 中的 .forEach()

javascript - 如何在 Node js 中保存表示为字符串的 zip 文件

swift - 为什么我的 firestore 集合返回 0 个文档

javascript - Sequelize "model.associate"属性不再起作用?

node.js - Docker 在 M1 Mac(Apple Silicon)上的 apt-get 更新上卡住了