Electron中Firebase匿名登录失效且出现heartbeats undefined报错
原本通过CDN(www.gstatic.com)引入Firebase,迁移到Electron本地SDK后,启动应用时控制台刷出7条重复报错:
(7) C:\Users\budiy\OneDrive\Documents\GitHub\Cornilieus\node_modules@firebase\app\dist\index.cjs.js:1056 heartbeats undefined
同时控制台一直输出Signing in,这段日志来自认证状态监听代码,说明signInAnonymously调用后未成功登录,auth状态始终处于未登录状态:
onAuthStateChanged((user) => { if (user) { // do something } else { console.log("Signing in") signInAnonymously(auth).then((user) => { console.log(user); }).catch((error) => { console.error(error); }); } });
除上述内容外,控制台仅显示Electron安全警告和开发者工具按键检测信息,无其他相关输出。
- 将Firebase版本从10.13降级至10.12.5
- 删除并重装
node_modules
以上操作均未解决signInAnonymously失效和heartbeats undefined报错问题。
1. 调整Electron安全配置适配Firebase
Electron的contextIsolation、nodeIntegration等安全设置可能干扰Firebase SDK运行,可先临时调整配置测试:
const mainWindow = new BrowserWindow({ webPreferences: { contextIsolation: false, // 临时关闭隔离测效果,正式环境建议用预加载脚本替代 nodeIntegration: true, allowRunningInsecureContent: false, } });
2. 初始化Firebase时禁用心跳检测
heartbeats undefined报错大概率是Firebase心跳检测在Electron环境中异常,初始化时可临时禁用该功能:
import { initializeApp } from "firebase/app"; import { getAuth, signInAnonymously, onAuthStateChanged } from "firebase/auth"; const firebaseConfig = { // 你的Firebase项目配置 }; const app = initializeApp(firebaseConfig); const auth = getAuth(app); // 禁用认证模块的心跳检测,规避报错 auth.settings.appVerificationDisabledForTesting = true;
3. 确认Firebase控制台已开启匿名登录权限
检查Firebase控制台,确保项目已启用匿名登录功能:
- 进入Firebase控制台 → 认证 → 登录方法 → 找到「匿名登录」→ 点击启用
4. 用预加载脚本隔离Firebase调用(正式环境推荐)
兼顾安全与功能,通过Electron预加载脚本将Firebase方法暴露给渲染进程:
- 编写
preload.js:const { contextBridge } = require('electron'); const { initializeApp } = require('firebase/app'); const { getAuth, signInAnonymously, onAuthStateChanged } = require('firebase/auth'); const firebaseConfig = { /* 你的项目配置 */ }; const app = initializeApp(firebaseConfig); const auth = getAuth(app); contextBridge.exposeInMainWorld('firebaseAuth', { signInAnonymously: () => signInAnonymously(auth), onAuthStateChanged: (callback) => onAuthStateChanged(auth, callback) }); - 在
main.js中配置预加载脚本:const path = require('path'); const mainWindow = new BrowserWindow({ webPreferences: { contextIsolation: true, preload: path.join(__dirname, 'preload.js'), } }); - 渲染进程中调用方式:
window.firebaseAuth.onAuthStateChanged((user) => { if (!user) { console.log("Signing in"); window.firebaseAuth.signInAnonymously() .then(user => console.log(user)) .catch(err => console.error(err)); } });
5. 统一Firebase依赖版本
尝试升级到最新稳定版(如10.14.x),或锁定与Electron兼容的版本,确保所有Firebase子包版本一致,避免版本冲突:
{ "dependencies": { "@firebase/app": "10.14.0", "@firebase/auth": "10.14.0" } }
内容的提问来源于stack exchange,提问作者Falling10fruit

