Ionic 为什么调用firebase函数时会出现FCM错误

hiz5n14c  于 2023-04-18  发布在  Ionic
关注(0)|答案(4)|浏览(158)

所以我通过AngularFire调用一个firebase函数如下:

const response = await this.aFunctions.httpsCallable<void, ResponseType>('funcName')().toPromise();

这在部署到firebase(托管)时有效,但在本地环境(使用ionic serve)中,它会抛出以下错误:

ERROR Error: Uncaught (in promise): FirebaseError: Messaging: We are unable to register the default service worker. Failed to register a ServiceWorker for scope ('http://localhost:8100/firebase-cloud-messaging-push-scope') with script ('http://localhost:8100/firebase-messaging-sw.js'): A bad HTTP response code (404) was received when fetching the script. (messaging/failed-service-worker-registration).
FirebaseError: Messaging: We are unable to register the default service worker. Failed to register a ServiceWorker for scope ('http://localhost:8100/firebase-cloud-messaging-push-scope') with script ('http://localhost:8100/firebase-messaging-sw.js'): A bad HTTP response code (404) was received when fetching the script. (messaging/failed-service-worker-registration).

我在这个项目中没有使用FCM。你知道为什么会发生这种情况吗?

laawzig2

laawzig21#

在我的例子中,我通过注解掉messagingSenderId解决了这个问题。

firebase: {
  apiKey: 'XXXXX',
  authDomain: 'XXXXX',
  databaseURL: 'XXXXX',
  projectId: 'XXXXX',
  storageBucket: 'XXXXX',
  // messagingSenderId: 'XXXXX',   **<== comment out this**
  appId: 'XXXXX'
}

我的情况有点不同和奇怪。我需要部署一个Angular项目到Firebase托管。

验证码:

const ob = this.functions.httpsCallable('api-name')({});
ob.subscribe((data)=>{
  //do something here
});

错误:

FirebaseError: Messaging: We are unable to register the default service worker.......

环境:

  • 当地人:好的
  • firebase hosting default Domain(projectName.web.app):错误
  • firebase托管默认域(projectName.firebaseapp.com):OK

我不知道原因,但希望它可以帮助你和其他人谁有类似的问题。

bjp0bcyl

bjp0bcyl2#

好的,我通过在我的应用程序中导入Firebase来修复它。
//此导入加载firebase命名空间沿着所有类型信息。import firebase from 'firebase/app';
//这些导入将各个服务加载到firebase命名空间中。import 'firebase/auth';import 'firebase/database';
我能够删除firebase-messaging-sw.js文件,所有onCall函数都可以正常工作。
我以前有一个混合:
import firebase from 'firebase;
import * as firebase from 'firebase'
标准化一切从'firebase/app'导入firebase+后续包你需要import 'firebase/functions'
现在一切正常

cld4siwp

cld4siwp3#

我希望我有一个更好的答案,但在我的情况下,我支持FCM,所以我需要提供messagingSenderId(虽然注解了没有修复的问题w/调用我的云函数)。
看起来如果你支持FCM并且想使用htttpsCallable,你需要先获得FCM代币🤷‍♂️
在我的例子中,在我的云函数调用解决了我的问题之前移动这个:

const vapidKey = 'yourkey'
    const token = await firebase.messaging().getToken({ vapidKey })
    const result = await firebase.functions().httpsCallable('updateEventReaction');
    ...
apeeds0o

apeeds0o4#

如果你在使用firease 9模块和compat库之间的混合,它可能会导致一些不可想象的行为。
例如,如果您使用模块库进行FireBase消息传递,使用Compat库进行函数传递

import { AngularFireFunctions } from '@angular/fire/compat/functions';
import { getMessaging, onMessage } from 'firebase/messaging';

然后在我的例子中,在注册一个FCM标记后调用一个函数会导致你所遇到的错误
因此,要么将您的所有FireBase库调用迁移到模块化版本,要么保留消息传递库的Compat版本

相关问题