我遇到了一些麻烦,因为我不太了解next.js和Firebase的Cloud Firestore的玩法,但是基本上可以用:
export async function fetchBroadcasts() {
const db = await loadDB();
const firestore = db.firestore();
const settings = { timestampsInSnapshots: true };
firestore.settings(settings);
return await firestore.collection('broadcasts').doc('message').get().then(doc => ({ broadcast: doc.data() }));
}
这不是:
export async function fetchBroadcasts() {
const db = await loadDB();
const firestore = db.firestore();
const settings = { timestampsInSnapshots: true };
firestore.settings(settings);
return await firestore.collection('broadcasts').doc('message').onSnapshot(doc => ({ broadcast: doc.data() }));
}
由于我基本上遵循documentation,因此我无法弄清为什么第二个选项不起作用。
在我的index.js
页面上,我有以下内容:
static async getInitialProps() {
return fetchBroadcasts();
}
答案 0 :(得分:0)
onSnapshot
不会返回承诺,因此您无法await
。从链接的API文档中可以看到,当您要停止刚刚添加的侦听器时,它会返回您调用的函数。
要在不断接收该文档更改的文档上设置持久侦听器时,请使用onSnapshot
。当您需要该文档的单个快照时,可以使用get
。
答案 1 :(得分:0)
Firestore的onSnapshot()始终返回文档数组,无论您使用哪种查询:
firestore.collection('broadcasts').doc('message')
.onSnapshot(docs => {
return docs[0].data();
});
在获取的情况下,您也可以在查询的基础上获取单个文档:
firestore.collection('broadcasts').doc('message')
.get( doc => ({ broadcast: doc.data() }) );