gpt4 book ai didi

node.js - 从 Firestore 获取异步值

转载 作者:行者123 更新时间:2023-12-01 08:45:25 26 4
gpt4 key购买 nike

我正在为异步操作而苦苦挣扎。我试图简单地从 firestore 获取一个值并将其存储在一个 var 中。

我设法接收到该值,我什至可以在我专门执行此操作时将其保存在 var 中(在 get 函数中使用 var),但是在尝试以灵活的方式保存它时,我似乎没有正确管理 await:

async function getValues(collectionName, docName,) {
console.log("start")
var result;
var docRef = await db.collection(collectionName).doc(docName).get()
.then(//async// (tried this as well with async) function (doc) {
if (doc.exists) {
console.log("Document data:", doc.data());
result = doc.data().text;
console.log(result);
return //await// (this as well with async) result;
} else {
// doc.data() will be undefined in this case
console.log("No such document!");
result = "No such document!";
return result;
}
console.log("end");
}).catch (function (err) {
console.log('Error getting documents', err);
});
};

helpMessage = getValues('configuration','helpMessage');

注: doc.data().text -> "text"是存储我的值的字段的名称。我是否必须使用 .value这里?

我在控制台得到的结果是:
info: Document data: { text: 'The correct text from the database' }
info: The correct text from the database


但是在我的代码中使用 helpMessage 我得到
{}


Image from the Telegram bot where I am trying to use the helpMessage as a response to the '/help' command.

我查了一下: getting value from cloud firestore ,
Firebase Firestore get() async/await , get asynchronous value from firebase firestore reference最重要的是 How do I return the response from an asynchronous call? .他们要么处理多个文档(使用 forEach),要么不解决我的问题的异步性质,要么(最后一种情况),我根本无法理解它的性质。

此外,nodejs 和 firestore 似乎都在快速发展,很难找到好的、最新的文档或示例。任何指针都非常有用。

最佳答案

你有错误的方式。这比你想象的要容易得多。

function getValues(collectionName, docName) {
return db.collection(collectionName).doc(docName).get().then(function (doc) {
if (doc.exists) return doc.data().text;
return Promise.reject("No such document");
}};
}

如果函数返回一个 promise (如 db.collection(...).doc(...).get() ),则返回该 promise 。这是“外” return以上。

在 promise 处理程序中(在 .then() 回调中),返回一个值表示成功,或者返回一个被拒绝的 promise 来表示错误。这是“内在” return以上。除了返回被拒绝的 promise ,您还可以 throw如果你想,一个错误。

现在你有了一个返回 promise 的函数。您可以通过 .then() 使用它和 .catch() :
getValues('configuration','helpMessage')
.then(function (text) { console.log(text); })
.catch(function (err) { console.log("ERROR:" err); });

await它在 async 内在 try/catch 块中的函数,如果你更喜欢它:
async function doSomething() {
try {
let text = await getValues('configuration','helpMessage');
console.log(text);
} catch {
console.log("ERROR:" err);
}
}

如果您想在 getValues() 中使用 async/await功能,您可以:
async function getValues(collectionName, docName) {
let doc = await db.collection(collectionName).doc(docName).get();
if (doc.exists) return doc.data().text;
throw new Error("No such document");
}

关于node.js - 从 Firestore 获取异步值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55239133/

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