gpt4 book ai didi

javascript - 简单的 Firestore 查询无法为我提供集合中的完整文档

转载 作者:行者123 更新时间:2023-12-02 21:12:22 25 4
gpt4 key购买 nike

我的 Firestore 数据模型如下所示

Organizations/{orgId}/cloudAccounts/{cloudAccountId}/resources/{resourceId}

我正在运行一个像这样的简单查询

let documents = await db.collection("Organizations")
.doc("orgIdabc")
.collection("cloudAccounts")
.doc("cloudAccountIdabc")
.collection("resources")
.get();

console.log("LENGTH: ", documents.docs.length);

现在的问题是,当我尝试记录文档长度时,它总是给我不同的长度。我也会分享输出。

     LENGTH:  18
LENGTH: 19
LENGTH: 19
LENGTH: 6
LENGTH: 3
LENGTH: 19
LENGTH: 12
LENGTH: 19
LENGTH: 19

现在实际长度是 19,但正如你所看到的,我得到了不同的长度。我不知道这里出了什么问题,任何帮助将不胜感激。

已更新根据要求我添加完整的代码片段另外我发现这个问题只发生在 Admin SDK 上,而不是客户端 SDK 上

const { db } = require("./firestore");
const functions = require("firebase-functions");

exports.runScanOnAllCloudAccounts = functions.https.onRequest((req, res) => {
runScanOnAllCA();
return res.status(200);
});

async function runScanOnAllCA() {
try {
for (let i = 0; i < 10; i++) {
let documents = await db.collection("Organizations")
.doc("orgIdabc")
.collection("cloudAccounts")
.doc("cloudAccountIdabc")
.collection("resources")
.get();

console.log("LENGTH: ", documents.docs.length);
}
} catch (err) {
console.log("err: ", err);
}
}

更新02 ===========>我已经按照一些用户的建议更新了代码以使用 Promise() 重型方法,但我仍然得到不同的文档长度。我觉得人们忽略了这一点,Promise 只是运行异步代码的一种方式,我们可以通过使用以前版本的代码中已经使用的 async wait 来解决这个问题。下面的代码片段仍然不能解决问题。

const { db } = require("./firestore");
const functions = require("firebase-functions");

exports.runScanOnAllCloudAccounts = functions.https.onRequest(
async (req, res) => {
runScanOnAllCA(res)
.then(resolve => {
console.log(resolve);
})
.catch(err => {
console.log(err);
});
// return res.status(200);
}
);

async function runScanOnAllCA(res) {
return new Promise(async (resolve, reject) => {
db.collection("Organizations")
.doc("sumair-hello-world_axtr8")
.collection("cloudAccounts")
.doc("4ZQgjt94pvEQTlvxSJ75")
.collection("resources")
.get()
.then(querySnapshot => {
resolve(querySnapshot.docs.length);
})
.catch(err => {
reject(err);
});
});
}

最佳答案

您应该使用Admin SDK以便从云功能与 Firestore 交互。

其次,众所周知,在循环中使用await 可能会导致“不稳定”的结果。例如,参见 https://www.google.com/search?client=firefox-b-d&q=for+and+await

最后,请注意,您错误地调用了异步 runScanOnAllCA() 函数。您应该使用 then()或者使您的云函数async并使用await,请参阅下面的代码。

您应该按如下方式调整您的 CF 以使用 Admin SDK:

const functions = require('firebase-functions');
const admin = require('firebase-admin');

admin.initializeApp();

exports.runScanOnAllCloudAccounts = functions.https.onRequest(async (req, res) => {
await runScanOnAllCA(); //<--- Note the await here and the async above, since you are calling an async function
res.status(200); //<--- No need to use return in an HTTPS Cloud Function, just terminate it with res.redirect(), res.send(), or res.end().
});

async function runScanOnAllCA() {
try {
const db = admin.firestore();

//The loop was removed. Use another way if needed, e.g. Promise.all() or the techniques presented in the links above.

let documents = await db.collection("Organizations")
.doc("orgIdabc")
.collection("cloudAccounts")
.doc("cloudAccountIdabc")
.collection("resources")
.get();

console.log("LENGTH: ", documents.docs.length);
} catch (err) {
console.log("err: ", err);
}
}

关于javascript - 简单的 Firestore 查询无法为我提供集合中的完整文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61055362/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com