Guillaume Prévost
Guillaume Prévost

Reputation: 413

NuxtJS & Firebase : upgrading to NodeJS 16 engine breaks Firestore listener (Firebase rules)

I've been using NuxtJS (v2.15.8) with Nuxt Firebase (v7.6.1), running on NodeJS engine 12 (v12.21.0 to be exact) for the web application I've been developping incrementally for the past couple of years and my web app is now quite complex.

I am trying to upgrade NodeJS to the latest LTS version (v16.13.2) and encounter one major issue after switching version of NodeJS (using nvm) and changing the package.json of my five packages from node 12 to node 16 :

package.json :

"engines": {
  "node": "16",
  ..
},

When running exactly the wame web application after these changes, it starts correctly but Firebase Rules seem to break, with this error FirebaseError: false for 'get' @ L61, false for 'get' @ L268.

It is a cryptic error, but from experience and from all I could find online, it happens when a call to Firestore that gets blocked by defined Firebase Security rules). In my case, it happens on a "onSnapshot" call to listen to the changes of the currently logged in user. Some other calls to Firestore (using "get" and not "onSnapshot") seem to work fine, and the Firebase Authentication works well too.

Here is the full error stack :

loggedInUser.js?384a:65 Error listening to user changes 
FirebaseError: false for 'get' @ L61, false for 'get' @ L268
    at new n (prebuilt-306f43d8-45d6f0b9.js?23bd:188:1)
    at eval (prebuilt-306f43d8-45d6f0b9.js?23bd:10426:1)
    at eval (prebuilt-306f43d8-45d6f0b9.js?23bd:10427:1)
    at n.onMessage (prebuilt-306f43d8-45d6f0b9.js?23bd:10449:1)
    at eval (prebuilt-306f43d8-45d6f0b9.js?23bd:10366:1)
    at eval (prebuilt-306f43d8-45d6f0b9.js?23bd:10397:1)
    at eval (prebuilt-306f43d8-45d6f0b9.js?23bd:15160:1)
    at eval (prebuilt-306f43d8-45d6f0b9.js?23bd:15218:1)

The portion of code triggerring the error is :

  listenUser({ commit }, userId) {
    const userRef = this.$fire.firestore.collection('users').doc(userId);
    userListener = userRef.onSnapshot(function(userDoc) {
      if (userDoc.exists) {
        const user = userConverter.fromFirestoreData(userDoc.data());
        commit('SET_LOGGED_IN_USER', user);
      }
    },
    function(error) {
      console.error("Error listening to user changes", error);
    });
  },

As soon as I revert back to Node 12, the same call works fine and isn't blocked by the Firebase rules, so the error doesn't appear.

I therefore have several questions :

  1. Does anyone understand what's happening there ? Is there known changes in the behavior of Firebase rules directly related to the NodeJS engine ?

  2. Do you think this issue can come from Nuxt or its Nuxt Firebase module are not working correctly under NodeJS 16 ?

  3. It is required to also upgrade NuxtJS to a newer version or should it be possible to simply update the Node Engine ?

  4. Is it required to update to a newer version of Firebase (modular implementation) despite the Nuxt Firebase module stating :

"This module does not support the new modular syntax from Firebase v9+. If you plan to use the new modular mode of Version 9, we advise you to implement Firebase manually as described in the following medium article. It is currently unclear when, and if, this module will support the new modular mode."

Source : their Github repo

Any help to understand what's going on here is welcome !! Thanks a lot for your help !

Upvotes: 0

Views: 583

Answers (2)

Guillaume Prévost
Guillaume Prévost

Reputation: 413

Long story short : upgrading to Firebase v9 worked.

Before I did that, I got stuck with rules preventing me to access firestore documents as soon as I tried running the project under Node16 engine.

So I had to do the following changes :

  • updating Firebase to v9
  • implement the configuration through a plugin rather than the nuxt-firebase module
  • make all the required changes in my code to make use of v9 modular (I didn't try using the compat version)

Now that I use the latest version of Firebase, I tried again switching to NodeJS 16 and it runs fine, including the Firebase security rules.

Upvotes: 1

Lluís Muñoz
Lluís Muñoz

Reputation: 419

Regarding your questions:

  1. I'm unaware of what is causing this issue but there are no known changes in the behavior of Firebase Rules depending on the NodeJS version you are using.
  2. It's hard to assess without having more information. However I deployed a sample NuxtJS app following this guide on NodeJS 16 and it worked. Additionally the error code, as you mentioned, is caused when a Firestore Rule blocks a query. Therefore I think the root cause might be in the NuxtJS firebase module.
  3. I wasn't able to find any documentation suggesting that you need to upgrade NuxtJS when upgrading NodeJS. Additionally you mentioned that you are using version 2.15.8 of NuxtJS which according to this release notes is the latest version.
  4. I'm unsure on further support for NuxtJS considering that statement, but according to this Firebase documentation it is recommended to upgrade to version 9.

If you decide to attempt to upgrade to firebase v9 make sure to also upgrade Nuxt Firebase module to version 8.0.0 or higher, this version provides support to the compat library so you can use Firebase v9 although still with the old syntax, more information can be found here.

Lastly, if you'd like to test if a Firebase rule is working as expected you can quickly test it using the Rules Playground.

Upvotes: 1

Related Questions