NuxtJS 和 Firebase:升级到 NodeJS 16 引擎会破坏 Firestore 侦听器(Firebase 规则)

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

准确地说,我一直在使用 NuxtJS (v2.15.8) with Nuxt Firebase (v7.6.1), running on NodeJS engine 12 (v12.21.0 来开发我在过去几年中逐步开发的 Web 应用程序,现在我的 Web 应用程序非常复杂。

我正在尝试将 NodeJS 升级到最新的 LTS 版本 (v16.13.2),在切换 NodeJS 版本(使用 nvm)并更改package.json 我从节点 12 到节点 16 的五个包:

package.json :

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

当 运行 完全是经过这些更改后的 wame web 应用程序时,它会正确启动,但 Firebase 规则似乎会中断,出现此错误 FirebaseError: false for 'get' @ L61, false for 'get' @ L268

这是一个神秘的错误,但根据经验和我在网上可以找到的所有内容,当对 Firestore 的调用被定义的 Firebase 安全规则阻止时,就会发生这种情况)。在我的例子中,它发生在一个“onSnapshot”调用上,以监听当前登录用户的变化。对 Firestore 的其他一些调用(使用“get”而不是“onSnapshot”)似乎工作正常,Firebase 身份验证也工作良好。

这是完整的错误堆栈:

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)

触发错误的代码部分是:

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

当我恢复到节点 12 时,相同的调用工作正常并且没有被 Firebase 规则阻止,所以错误没有出现。

因此我有几个问题:

  1. 有谁知道那里发生了什么?与 NodeJS 引擎直接相关的 Firebase 规则的行为是否有已知变化?

  2. 您认为这个问题可能来自 Nuxt 还是它的 Nuxt Firebase 模块在 NodeJS 16 下无法正常工作?

  3. 还需要将 NuxtJS 升级到更新的版本,或者是否可以简单地更新节点引擎?

  4. 是否需要更新到更新版本的 Firebase(模块化实现)尽管 Nuxt Firebase 模块声明:

"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."

来源:their Github repo

欢迎任何帮助理解这里发生的事情!! 非常感谢您的帮助!

关于您的问题:

  1. 我不知道是什么导致了这个问题,但是根据您使用的 NodeJS 版本,Firebase 规则的行为没有已知的变化。
  2. 在没有更多信息的情况下很难进行评估。但是,我在 this guide 之后在 NodeJS 16 上部署了一个示例 NuxtJS 应用程序并且它有效。此外,如您所述,错误代码是在 Firestore 规则阻止查询时引起的。因此我认为根本原因可能在 NuxtJS firebase 模块中。
  3. 我找不到任何建议您在升级 NodeJS 时需要升级 NuxtJS 的文档。此外,您提到您正在使用 NuxtJS 的 2.15.8 版本,根据 this release notes 是最新版本。
  4. 考虑到该声明,我不确定是否进一步支持 NuxtJS,但根据 this Firebase documentation 建议升级到版本 9。

如果您决定尝试升级到 firebase v9,请确保也将 Nuxt Firebase 模块升级到版本 8.0.0 或更高版本,此版本提供对兼容库的支持,因此您可以使用 Firebase v9,尽管仍然旧语法,可以找到更多信息 here.

最后,如果您想测试 Firebase 规则是否按预期工作,您可以使用 Rules Playground.

快速测试它

长话短说:升级到 Firebase v9 成功了。

在我这样做之前,我一尝试 运行 Node16 引擎下的项目,就遇到了阻止我访问 firestore 文档的规则。

所以我必须进行以下更改:

  • 正在将 Firebase 更新到 v9
  • 通过插件而不是 nuxt-firebase 模块实现配置
  • 在我的代码中进行所有必要的更改以使用 v9 模块化(我没有尝试使用兼容版本)

现在我使用了最新版本的 Firebase,我再次尝试切换到 NodeJS 16,它运行良好,包括 Firebase 安全规则。