【发布时间】:2021-10-09 14:31:39
【问题描述】:
我仍在努力了解如何从 Firestore 查询中提取值并将它们放入全局变量中。我(现在)理解异步性质意味着代码不是按照编写的顺序执行的。但是,尽管async 函数内部有await 关键字,为什么user 在以下代码块中仍未定义?我了解(基于this question)await 应仅应用于get(),否则可能没有要迭代的值。
我的问题与this 类似,但我遇到了与评论相同的问题,并且看起来该问题从未标记为已回答。它也类似于this,但将所有的gets 推送到一个Promise,然后解决该promise 仍然没有将数据分配给一个变量。它只是打印了一个空数组。
我可以打印变量,所以我想我的问题是关于赋值。该函数是DialogFlow 中Intent 的处理程序。我强烈希望在对 db 的调用之外提供可用的数据。在对 firestore 的调用中添加到代理响应并不总是将文本添加到代理,所以我想避免这种情况。
async function loginHandler(agent){
username = agent.parameters.username.name;
password = agent.parameters.password;
const user = await db.collection("users")
.where("name","==",username)
.where("password","==",password)
.limit(1)
.get()
.then(querySnapshot =>{
querySnapshot.forEach(docSnapShot =>{
return docSnapShot.data();
//console.log.(docSnapShot.data()); //prints correct contents, so error is in programming logic
agent.add("Response"); // Would prefer to avoid this, but could refactor if I am fundamentally misunderstanding how to access Firebase data
})
})
.catch(error => console.log);
console.log(user);
console.log("bort");
}
Firestore 的图片以证明确实存在正确的数据:
【问题讨论】:
标签: javascript firebase asynchronous google-cloud-firestore dialogflow-es-fulfillment