VueJS - Vuefire - TypeError:document.onSnapshot 不是函数

Posted

技术标签:

【中文标题】VueJS - Vuefire - TypeError:document.onSnapshot 不是函数【英文标题】:VueJS - Vuefire - TypeError: document.onSnapshot is not a function 【发布时间】:2021-06-26 04:48:15 【问题描述】:

我正在尝试在我的项目中实现 Vuefire。我正在遵循 Vuefire 网站上的指南,但仍然出现此错误。

db.js:

import firebase from 'firebase/app'
import 'firebase/firestore';
const firebaseConfig = 
apiKey: ....,
authDomain: ....,
projectId: ....,
storageBucket: ...,
messagingSenderId:....,
appId: ..."
;
const app = firebase.initializeApp(firebaseConfig)
export const db = app.firestore()

main.js

    import Vue from 'vue';
import App from './App.vue';
import vuetify from './plugins/vuetify';
import  firestorePlugin  from 'vuefire'
import DatetimePicker from 'vuetify-datetime-picker';
Vue.use(firestorePlugin)
Vue.config.productionTip = false;
Vue.use(DatetimePicker)
new Vue(
vuetify,
render: h => h(App)
).$mount('#app');

App.vue

import  db  from "../db";
export default 
name: "App",
data() 
return 
fireDB: [],
  ,
mounted() 

console.log(this.fireDB);
  ,
firestore: 
// fireDB: db.collection("something").doc('else').get().then((res) => 
//   console.log(res);
// ) - like this it gives me the error.

//fireDB: db.collection("something") - like this it returns an array with an object that is my database.
  ,

;

从控制台我看到调用 onSnapshot 的“文档”是一个承诺

【问题讨论】:

【参考方案1】:

我不确定这是否是您的问题的原因,但我在使用 VuexFire 时遇到了同样的错误,这是因为我安装了 Firebase v9,它有一个新的 API,并且与 Vuefire 不兼容。

您可以尝试使用新的 Firebase v9 API 或降级到 v8 - 这是当前 Viewfire 站点中的示例代码使用的(实际上我认为它说它是 v7,但它适用于 v8)。

要降级,请检查您的 package.json 以了解 Firebase 的版本,并确保它是 v8,例如 "firebase": "^8.10",(并运行 npm i

这是 v8 查询语法 https://firebase.google.com/docs/firestore/quickstart#web-version-8_4

db.collection("users").get().then((querySnapshot) => 
    querySnapshot.forEach((doc) => 
        console.log(`$doc.id => $doc.data()`);
    );
);

这是 v9 语法 https://firebase.google.com/docs/firestore/quickstart#web-version-9_4

const querySnapshot = await getDocs(collection(db, "users"));
querySnapshot.forEach((doc) => 
  console.log(`$doc.id => $doc.data()`);
);

我发现 VuexFire v3.2.5 在将新文档发布到 Firebase v9 时可以正常工作,但在绑定集合时出现 onSnapshot 错误。所以我降级到 Firebase v8 并将我的绑定切换到旧语法(根据 Viewfire 文档)。

存在一个关于升级的 Viewfire 问题,该问题处于活动状态(截至 2021 年 10 月)但尚未完成。 https://github.com/vuejs/vuefire/issues/1128

【讨论】:

以上是关于VueJS - Vuefire - TypeError:document.onSnapshot 不是函数的主要内容,如果未能解决你的问题,请参考以下文章

在 Vuejs 中渲染 DOM 之前,使用路由器中的参数获取 firebase 数据(使用或不使用 vuefire)?

使用 VueFire,我如何按日期降序排列我的列表(从最新到最旧)?

导入 firebase.firestore() 返回未定义

Vuefire(Firestore)非常非常慢的查询

如何让 vuefire 显示加载屏幕?

将 getter 设置到 vuefire 的 firestore 部分