在 react s-s-r 应用程序中调用 firebase 消息传递方法时,如何修复 self 未定义?

Posted

技术标签:

【中文标题】在 react s-s-r 应用程序中调用 firebase 消息传递方法时,如何修复 self 未定义?【英文标题】:How to fix self is not defined when firebase messaging method called in react s-s-r app? 【发布时间】:2020-01-10 00:47:22 【问题描述】:

我正在尝试在使用 https://github.com/jaredpalmer/razzle with-react-router-3 创建的 s-s-r 应用程序中使用 firebase 按摩。我已经在使用 firebase,它非常好用,包括托管。但是当我开始在应用程序中添加消息时开始抛出错误。

我的入口点看起来像,

import firebase from 'firebase/app';
import 'firebase/auth';
import 'firebase/database';
import 'firebase/storage';
import 'firebase/firestore';
import 'firebase/messaging';

import FirebaseConfig from 'config/firebase-config.json';
if (!firebase.apps.length) 
  firebase.initializeApp(FirebaseConfig);

const messaging = firebase.messaging();

当我使用razzle start 启动服务器时出现以下错误

/Users/subkundu/Desktop/Work/Projects/React/ownerstown/node_modules/@firebase/messaging/index.ts:75
  if (self && 'ServiceWorkerGlobalScope' in self) 
  ^

ReferenceError: self is not defined

我该如何解决?任何领先都会令人惊叹。谢谢。 :)

【问题讨论】:

【参考方案1】:

我相信您必须提供检查以查看window 是否可用。

let Messaging;
if (YOUR_CHECK_HERE) 
    Messaging = firebase.messaging();

// Then you can use "Messaging"

我不熟悉 razzle。访问 window 取决于服务器端渲染 (s-s-r) 框架。我从这个post 得到了这个想法。当我用 nuxt.js 遇到这个问题时,我可以用这个 process.browser 检查 window。希望这会有所帮助!

【讨论】:

是的,你是对的!感谢您回复。一周前,我通过执行类似 export default function isBrowser(func) return process.browser 之类的操作来修复它?函数 : () => isBrowser(func); 并在我的文件中使用它

以上是关于在 react s-s-r 应用程序中调用 firebase 消息传递方法时,如何修复 self 未定义?的主要内容,如果未能解决你的问题,请参考以下文章

在 NextJS s-s-r 流程中何时以及如何调用 React 生命周期方法?

React s-s-r Firebase 应用程序中的图像

React/nextJS:如何调试 s-s-r react 应用的不同节点?

ReactDOM.hydrate() 在初始 s-s-r (React JS) 后不起作用

如何将 React s-s-r 应用程序部署到 Heroku?

有啥方法可以避免在 s-s-r 中使用 React 出现“文本内容不匹配”警告?