Cloud Firestore使用next.js与.get()正常工作,但与.onSnapshot()不能正常工作

时间:2019-01-09 17:45:44

标签: javascript firebase google-cloud-firestore next.js

我遇到了一些麻烦,因为我不太了解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();
}

2 个答案:

答案 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() }) );