未捕获的 Firebase 错误:消息传递:此方法在 Window 上下文中可用



我正在使用Firebase Service Worker进行网络推送通知。目前,我面临此错误:

Uncaught FirebaseError: Messaging: This method is available in a Window context. (messaging/only-available-in-window).

我正在使用桌面上的网站来注册软件。如何解决此问题?

我在控制台中遇到的错误堆栈。

browserErrorMessage: "Failed to register a ServiceWorker: ServiceWorker script evaluation failed"
code :"messaging/failed-serviceworker-registration"
message :"Messaging: We are unable to register the default service worker. Failed to register a ServiceWorker: ServiceWorker script evaluation failed (messaging/failed-serviceworker-registration)."
stack: "FirebaseError: Messaging: We are unable to register the default service worker. Failed to register a ServiceWorker: ServiceWorker script evaluation failed (messaging/failed-serviceworker-registration).↵    at https://www.gstatic.com/firebasejs/3.7.0/firebase.js:555:225"
__proto__: Error

谢谢

此方法应该在主 javascript 文件中,而不是在 service worker 中。服务工作进程在后台工作。

    messaging.onMessage(function(payload) {
      console.log("Message received. ", payload);
      // ...
    });

请保留该行,这在SW中是非常需要的:

const messaging = firebase.messaging((;

问题不在于消息传递本身,而很可能是软件中使用的部分,但是那里不支持。

可悲的是,我无法从软件中看到您的代码,但是导致此问题的原因是,当网站位于前台时,我实现了以下内容来接收消息:

messaging.onMessage(function(payload) {
  console.log("Message received. ", payload);
  // ...
});

但是,这需要窗口上下文,并且需要在实际网站而不是软件中实现。对我来说,这导致了您描述的错误。

尝试使用 Firebase 示例软件。这是它需要做的一切,并允许您在后台接收通知。

如果您想分享您的软件代码,我们可以看看它。

发生这种情况

是因为您可能已在服务工作者文件(firebase-messaging-sw.js(中添加了以下代码。const messaging = firebase.messaging((;

删除它并查看代码是否有效。

上面的行应仅添加到索引中.html。

我收到了类似的错误。更新我的 JavaScript 以使用新的服务器密钥而不是旧的服务器密钥消除了错误。要获取新密钥,请转到 Firebase 控制台 --> 云消息传递。请注意,Firebase 控制台概览页面上的网络应用快速入门仍使用旧密钥。

var config = {
    apiKey: "<**newAPIKey**>",
    authDomain: "<domain>",
    databaseURL: "<databaseUrl>",
    projectId: "<id>",
    storageBucket: "",
    messagingSenderId: "<SenderId>"
};
firebase.initializeApp(config);

最新更新