Javascript Firebase消息传递错误:在获取令牌之前使用服务工作者

Javascript Firebase消息传递错误:在获取令牌之前使用服务工作者,javascript,firebase,firebase-cloud-messaging,Javascript,Firebase,Firebase Cloud Messaging,我尝试将FCM与angularjs一起使用,因此在初始化firebase后,我编写了以下代码: messaging = firebase.messaging(); $window.navigator.serviceWorker.register($rootScope.app.base_url + '/app/lib/firebaseCustomWorker.js') .then(function(registration) { messaging.useServiceWorker(reg

我尝试将FCM与angularjs一起使用,因此在初始化firebase后,我编写了以下代码:

messaging = firebase.messaging();
$window.navigator.serviceWorker.register($rootScope.app.base_url + '/app/lib/firebaseCustomWorker.js')
.then(function(registration) {
    messaging.useServiceWorker(registration);
    messaging.requestPermission().then(function(){  
    messaging.getToken()
    .then(function(currentToken) {
        console.log(currentToken);
    })
    .catch(function(err) {
        console.log('An error occurred while retrieving token. ', err);
    });
}).catch(function(err){console.log(err)});
问题在于,最后一行有时会捕获控制台中出现的错误,代码为“消息传递/在获取令牌之前使用sw”,消息中显示:

FirebaseError:消息传递:在调用getToken()之前,必须调用useServiceWorker(),以确保使用您的服务工作者。(在获取令牌之前发送消息/使用软件)

正如您在上面的代码中所看到的,我只在调用
useServiceWorker()
requestPermission()之后调用
getToken()


我深入查看了第35行的原始
firebase messaging.js
文件,但不幸的是,我不知道为什么会发生这种情况

我知道这可能很疯狂,而且会适得其反,但它是有效的

 .
 .
 .
 if('undefined' !== typeof messaging.b )
      delete(messaging.b);
 messaging.useServiceWorker(registration);
 .
 .
 .

受阅读firebase-messaging.js的启发,我对你的答案有一个类似的疯狂想法:

if (!firebase.apps[0]) {
    firebase.initializeApp(config);
}
我发现使用
firebase.initializeApp(config)
比使用
navigator.serviceWorker.register
更好。可以多次调用它,而不必担心是否加载了服务工作者。只需在应用程序的每个页面上都添加此内容:

var config = {
    apiKey: "...",
    authDomain: "...",
    databaseURL: "...",
    projectId: "...",
    storageBucket: "...",
    messagingSenderId: "..."
}

firebase.initializeApp(config);

尝试使用新版本的firebase


嘿,是的,那太可怕了。但是找到一个解决办法很好。请看我的答案。
 messaging.getToken({
                        serviceWorkerRegistration: registration,
                        vapidKey: keyPair
                    }).then((currentToken) => {
                        if (currentToken) {
                            console.log(currentToken)
                        } else {
                            // Show permission request UI
                            console.log('No registration token available. Request permission to generate one.');
                        }
                    }).catch((err) => {
                        console.log('An error occurred while retrieving token. ', err);
                    });