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



我一直在使用NuxtJS(v2.15.8(和Nuxt Firebase(v7.6.1(,在NodeJS引擎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);
});
},

一旦我返回到Node 12,相同的调用就可以正常工作,并且不会被Firebase规则阻止,因此不会出现错误

因此,我有几个问题:

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

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

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

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

"此模块不支持Firebase v9+中的新模块化语法。如果您计划使用版本9的新模块化模式,我们建议您手动实现Firebase,如以下媒体文章中所述。目前尚不清楚该模块何时以及是否支持新的模块化模式">

来源:他们的Github repo

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

关于您的问题:

  1. 我不知道是什么导致了这个问题,但根据您使用的NodeJS版本,Firebase规则的行为没有已知的变化
  2. 如果没有更多的信息,很难进行评估。然而,我按照本指南在NodeJS 16上部署了一个示例NuxtJS应用程序,它起到了作用。此外,正如您所提到的,错误代码是在Firestore规则阻止查询时引起的。因此,我认为根本原因可能是在NuxtJS firebase模块中
  3. 我找不到任何文档表明在升级NodeJS时需要升级NuxtJS。此外,您提到您使用的是NuxtJS的2.15.8版本,根据本发行说明,这是最新版本
  4. 考虑到这一说法,我不确定是否会进一步支持NuxtJS,但根据Firebase的文档,建议升级到9版

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

最后,如果你想测试Firebase规则是否按预期工作,你可以使用规则游乐场快速测试它。

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

在此之前,我遇到了一些规则,这些规则阻止我在Node16引擎下运行项目时立即访问firestore文档。

所以我不得不做以下改变:

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

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

最新更新