Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Firestore arrayUnion

I'm building a basic CRUD app with vue.js and firebase. I'm trying to build out a favorites functionality and have ran into a persistent problem storing the data.

When a using clicks the add to favorites button I'm attempting to add the document id to an array in a "user profile" document. Here's the code:

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");
  }
}

I get the following error in the console:

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

I have firebase and the db ref imported, and have ran a bogus .set() through each reference to confirm they are pointing at the right spots. I also already have the arrays created in 'userProfile' document.

The firebase install is fresh, like last week fresh, so I should have the function in my build.

Seems that arrayUnion is just not working. Any ideas? The other firestore functions are workin so I'm not sure. Am I blatenly missing something? Thanks

like image 419
Tjb1187 Avatar asked Sep 07 '18 22:09

Tjb1187


2 Answers

I had the same issue...

This would not work

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

I changed the import and used the exact code from the Firebase Docs.
This works fine.

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

Hope that helps.

like image 72
DoubleTri Avatar answered Sep 27 '22 21:09

DoubleTri


If you are using the Admin SDK

I was having some random errors similar to this, among others as I was experimenting. It turns out it was because I was using firebase admin sdk which requires a slight change compared to the web SDK documentation. If you are using firebase admin, replace

firebase.firestore.FieldValue.arrayUnion(...

with

admin.firestore.FieldValue.arrayUnion(...

like image 41
Matthew Rideout Avatar answered Sep 27 '22 23:09

Matthew Rideout