You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ReactJS集成Firebase Cloud Messaging报错:messaging.getToken is not a function

Firebase Cloud Messaging集成问题:messaging.getToken()报错

问题描述

尝试集成FCM功能时,调用messaging.getToken()出现以下错误:

TypeError: WEBPACK_IMPORTED_MODULE_2__.messaging.getToken is not a function

已花费6小时排查仍未解决,相关代码文件如下:

原代码文件

文件:firebase.js

import { getMessaging, getToken } from "firebase/messaging";

export const requestPermission = () => {
    Notification.requestPermission()
    .then( permission => {
        if (permission === 'granted') {
            messaging.getToken()
            .then(currToken => console.log(currToken))
            .catch(err => console.log(err))
        }
    })
    .catch(err => console.log(err))
}

文件:main.js

<button onClick={requestPermission}>
    <p> New Task </p>
</button>

文件:firebase-messaging-sw.js

importScripts('https://www.gstatic.com/firebasejs/6.2.3/firebase-app.js');
importScripts('https://www.gstatic.com/firebasejs/6.2.3/firebase-messaging.js');

// Your web app's Firebase configuration
const firebaseConfig = {
  apiKey: "My api key",
  authDomain: "my domain name",
  projectId: "my project id",
  storageBucket: "my storage bucket address",
  messagingSenderId: "id",
  appId: "my app Id"
};

// Initialize Firebase
const app = initializeApp(firebaseConfig);

// Initialize Firebase Cloud Messaging
export const messaging = getMessaging();


export default app;

错误原因及修复方案

1. Firebase版本不兼容

项目同时使用了Firebase v9+模块化API(firebase.js中的import { getMessaging, getToken })和v6.2.3旧版本API(Service Worker中的importScripts),两者API结构差异极大,导致调用失败。需统一版本,推荐使用v9+兼容模式或纯模块化模式。

2. 未正确初始化Messaging实例

firebase.js中直接使用了未定义的messaging变量,需先初始化Firebase App,再创建Messaging实例。

3. Service Worker代码错误

旧版本Service Worker不支持export语法,且初始化方式与新版本不匹配。


修正后的代码

文件:firebase.js(使用v9+模块化API)

import { initializeApp } from "firebase/app";
import { getMessaging, getToken } from "firebase/messaging";

// 初始化Firebase App
const firebaseConfig = {
  apiKey: "My api key",
  authDomain: "my domain name",
  projectId: "my project id",
  storageBucket: "my storage bucket address",
  messagingSenderId: "id",
  appId: "my app Id"
};

const app = initializeApp(firebaseConfig);
const messaging = getMessaging(app);

export const requestPermission = () => {
  Notification.requestPermission()
    .then(permission => {
      if (permission === 'granted') {
        // v9+的getToken需要传入messaging实例和VAPID密钥
        getToken(messaging, { vapidKey: "你的VAPID公钥" })
          .then(currToken => console.log(currToken))
          .catch(err => console.log(err))
      }
    })
    .catch(err => console.log(err))
}

文件:firebase-messaging-sw.js(统一使用v9+兼容模式)

importScripts('https://www.gstatic.com/firebasejs/9.23.0/firebase-app-compat.js');
importScripts('https://www.gstatic.com/firebasejs/9.23.0/firebase-messaging-compat.js');

const firebaseConfig = {
  apiKey: "My api key",
  authDomain: "my domain name",
  projectId: "my project id",
  storageBucket: "my storage bucket address",
  messagingSenderId: "id",
  appId: "my app Id"
};

firebase.initializeApp(firebaseConfig);
const messaging = firebase.messaging();

// 后台消息处理(可选)
messaging.onBackgroundMessage((payload) => {
  const notificationTitle = payload.notification.title;
  const notificationOptions = {
    body: payload.notification.body,
    icon: '/firebase-logo.png'
  };

  self.registration.showNotification(notificationTitle, notificationOptions);
});

额外注意事项

  • 获取VAPID密钥:在Firebase控制台→项目设置→云消息传递→Web配置→生成密钥对,复制公钥作为vapidKey参数。
  • 确保Service Worker文件放在项目根目录,且在HTTPS环境下运行(本地开发可使用localhost)。
  • 项目安装的firebase包版本需与Service Worker中引入的版本一致(比如都用9.23.0)。

内容的提问来源于stack exchange,提问作者Tanmay Chavan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 13:48:22