【问题标题】:Firestore arrayUnionFirestore 数组联合
【发布时间】:2019-02-13 06:28:00
【问题描述】:

我正在使用 vue.js 和 firebase 构建一个基本的 CRUD 应用程序。我正在尝试构建收藏夹功能,但在存储数据时遇到了持久性问题。

当用户单击添加到收藏夹按钮时,我正在尝试将文档 ID 添加到“用户配置文件”文档中的数组中。代码如下:

export function addNewUserAction (type, key, userID){
  console.log(userID);
  console.log(key);

  firebase.firestore().collection('userActions').add({
    type: type,
    listing: key,
    user: userID,
    time: Date.now()
  })
  if(type === 'favorite'){
    var sendfav = db.collection('userProfiles').doc(userID).update({
      favs: firebase.firestore.FieldValue.arrayUnion(key)
    });
  }else if(type === 'xout'){
    var sendxout = db.collection('userProfiles').doc(userID).update({
      xouts: firebase.firestore.FieldValue.arrayUnion(key)
    });
  }else{
    console.error(type + " is not a user action");
  }
}

我在控制台中收到以下错误:

Uncaught TypeError: Cannot read property 'arrayUnion' of undefined
    at addNewUserAction

我已经导入了 firebase 和 db ref,并且通过每个引用运行了一个虚假的 .set() 以确认它们指向正确的位置。我也已经在“userProfile”文档中创建了数组。

firebase 安装是全新的,就像上周一样,所以我的构建中应该有这个功能。

似乎 arrayUnion 只是不工作。有任何想法吗?其他 Firestore 功能正在运行,所以我不确定。我是否突然错过了什么?谢谢

【问题讨论】:

  • 嘿Tjb。 firebase.firestore.FieldValue 似乎是 undefined。你能准确地展示你是如何在你的代码中包含 Firebase 的吗?我只是想确保您使用的是正确的版本。
  • 谢谢弗兰克。我正在使用 initializeApp 函数在 Vue 中的一个组件中初始化 firebase,并提供我的道歉键、项目名称等,然后我将 firebase 导入到使用它的组件中。我承认我对如何初始化有点困惑,因为我已经在 Vue 应用程序中安装了 firebase。我还应该在 index.html 文件中包含 CDN 脚本吗?
  • 另外,刚刚检查了我的 package.json 文件,如果有帮助,它会显示 firebase/firestore version=0.7.1。
  • 请更新您的问题以包含重现问题所需的最小 package.json 和/或 HTML。但 0.7.1 对我来说听起来像是一个不寻常的版本。据我所知,最新的版本是 5.x 或 6.x。
  • 嗨弗兰克,很抱歉延迟回复。这是我的 package.json 用于 firebase 的内容:"dependencies": { "firebase": "^5.4.1", "vue": "^2.5.11", "vue-router": "^3.0.1", "vuefire": "^1.4.5" },

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


【解决方案1】:

如果您使用的是 Admin SDK

我在试验时遇到了一些类似的随机错误。事实证明,这是因为我使用的是 firebase admin sdk,与 Web SDK 文档相比,它需要稍作改动。如果您使用的是 firebase 管理员,请替换

firebase.firestore.FieldValue.arrayUnion(...

admin.firestore.FieldValue.arrayUnion(...

【讨论】:

  • 哈哈,谢谢,我觉得自己没注意到这个很愚蠢,但很高兴我不是唯一一个遇到这个问题的人
  • 是的,这东西有点混乱。它是如此相似,以至于文档似乎并没有打扰它,但是您怎么知道? :-)
【解决方案2】:

我有同样的问题...

这行不通

import { fireStore } from '../../firebase';
....
fireStore.collection("users").doc(props.uid).update({
    points: fireStore.FieldValue.arrayUnion({value: pointObj.value, reason: pointObj.reason})
});

我更改了导入并使用了 Firebase 文档中的确切代码。
这工作正常。

import * as firebase from 'firebase';
....
fireStore.collection("users").doc(props.uid).update({
    points: firebase.firestore.FieldValue.arrayUnion({value: pointObj.value, reason: pointObj.reason})
});

希望对您有所帮助。

【讨论】:

  • 我遇到了同样的问题。我花了一个小时试图找出问题所在。感谢您的帮助,它现在可以正常工作了.....
  • 我正在从另一个文件 ex) 'firebase.js' 导入 firebase。保留这一点,添加 line import * as firebase from 'firebase' 解决了问题
【解决方案3】:

只是想更新一下。我可以通过以下方式导入 firebase 来完成这项工作:

`import firebase from "firebase/firebase";`

我认为我之前的问题是几个问题,第一个主要是没有正确的版本。我最近刚刚更新到 5.8.4,这完全破坏了我的应用程序。我尝试了上述作为一种可能的解决方案,它让我的应用程序再次运行。这导致我尝试使用 arrayUnion 并且它有效。希望这对某人有帮助。谢谢大家的帮助。

2019 年 10 月 11 日更新 因此,我想为此添加另一个更新,以防 Firebase 的新用户像我一样追赶他们的尾巴。

所以我上面包含的解决方案有效,因为它使用了整个 firebase SDK 包('firebase/firebase'),这很好,但是您将导入整个 firebase 包,这并不理想。您经常会在控制台中看到您正在使用开发 SDK 的警报

如果您尝试优化您的应用并且只导入您需要的 firebase 包(即 auth、datatbase 等),您需要从“firebase/app”导入 firebase 应用对象,然后导入所需的包。关键是按照 firebase 文档的要求作为对象导入:

import * as firebase from 'firebase/app'; Import 'firebase/auth'

如果你使用:

import firebase from 'firebase/app' 这行不通。

希望对某人有所帮助。我知道这是很专业的东西,但它在我的学习曲线上困扰了我一段时间。

【讨论】:

    【解决方案4】:

    Firestore - Pass Array To arrayUnion()

    let myArray = ["1", "2", "3"];
    
    docRef.update({
        test: firebase.firestore.FieldValue.arrayUnion.apply(this, myArray)
    });
    

    这对我有用^

    【讨论】:

      【解决方案5】:

      对于 Vue.js 开发人员

      我在 src 文件夹中创建了一个名为 firebase 的文件夹,然后我在 firebase 文件夹中创建了一个名为 init.js 的文件

      init.js

      import * as firebase from "firebase/app";
      import "firebase/auth";
      import "firebase/firestore";
      
      // For Firebase JS SDK v7.20.0 and later, measurementId is optional
      const firebaseConfig = {
        // Your Firebase Config
      };
      
      // Initialize Firebase
      firebase.initializeApp(firebaseConfig);
      
      // utils
      const db = firebase.firestore();
      const auth = firebase.auth();
      
      export { db, auth, firebase };
      

      现在在您需要的任何组件中使用它们。 刚刚过去,

      import { firebase, auth, db } from "@/firebase/init.js";
      

      现在您可以使用 firebase 而不会出现任何错误

      db.collection("users") // Collection Name
      .doc(userId)           // Document in Collection indexed userId
      .update({
          friends: firebase.firestore.FieldValue.arrayUnion(auth.currentUser.uid)
      })
      // friends is the array collection in firestore
      

      就是这样

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-31
        相关资源
        最近更新 更多