NodeJS,Firestore获取字段

6

在这里输入图片描述

我已经在我的Node.js聊天机器人上设置了Firestore。 它成功地将Facebook用户ID复制到.doc名称中, 并在Firestore下设置其用户名和其他信息。

那么,我该如何检索此“字段”名称以显示给用户呢?

目前我所拥有的:

 const givename = db.collection('users').doc(''+ sender_id).get("name");  
 
 

然而,Firebase没有返回任何内容。

我已经在网上查阅了很多如何返回字段的资料,但是收效甚微。有什么建议吗?

3个回答

15

get() 方法调用时不会立即返回数据,因为数据是异步加载的。它返回一个 Promise 对象,一旦数据加载完成就会被解析。这意味着你可以使用 await(如 Francisco 的答案中所示)或者(如果没有 await 可用)实现 then() 方法:

db.collection('users').doc(''+ sender_id).get().then(function(doc) {
  console.log(doc.data().name);
});

需要注意的常见陷阱: doc.data() 只在回调函数中可用。


谢谢您的评论。 我还有点困惑。我得到了NaN作为响应。而Firebase日志没有显示任何关于名称的信息,这很奇怪。这可能意味着什么? - Mic
编辑。划掉那个。它是。然而。现在它在日志中打印,但不允许const givename =“code here”工作。或者这只是不可能的吗? - Mic
啊,我明白了,如果我想让我的代码触发名称,它需要在then()内部,这样我就可以使用一个const来调用这个函数,无论何时都可以调用。真是太糟糕了。我现在会解决这个问题,看看是否能找到一个解决方法 :) - Mic
没有通用的解决方法:学习异步工作原理是你能做的最好的事情。你能做到的最接近的方法是使用现代环境和await,就像Francisco的回答中所示。但如果你不理解异步调用,有时它也是一个泄漏的抽象。 - Frank van Puffelen
1
await是ES2017中引入的关键字(如果我没记错的话)。它在Node 8及更高版本中可用。如果您想尝试使用它,我建议在“在node.js中使用await”的几个搜索上进行一些搜索,因为它们可能会提供比我能够快速分享的更好的解释。 - Frank van Puffelen
显示剩余2条评论

4
我还没有使用过Firestore,但是通过阅读https://firebase.google.com/docs/firestore/query-data/get-data,下面这样的代码应该可以实现(未经测试):
const userRef = db.collection("users").doc("1234")
const userDoc = await userRef.get()
const {name} = userDoc.data()
console.log(name)

很不幸,这似乎无法解决问题。 获取一堆 userDoc.data 不是一个函数。 - Mic
1
userDoc.data 不是一个函数。 - ecairol

0

另一种方式是:

const givename = await db.collection("users").doc("YOUR DOCUMENT NAME").get();

console.log(givename.data().name);

记得将这段代码放在一个async函数中,因为我们在这里使用了await


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接