首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TypeError: firebase.default.messaging不是函数(在'_firebase.default.messaging()‘中,'firebase.default.messaging is undefined)

TypeError: firebase.default.messaging不是函数(在'_firebase.default.messaging()‘中,'firebase.default.messaging is undefined)
EN

Stack Overflow用户
提问于 2020-04-19 13:37:39
回答 3查看 2K关注 0票数 2

我想使用firebase云函数发送通知,所以我尝试使用firebase.messaging().getToken()获取令牌,但我一直收到错误:

TypeError: firebase.default.messaging不是函数(在'_firebase.default.messaging()‘中,'firebase.default.messaging is undefined)

我已经通过5种不同的方式安装了firebase和firebase/messages,但似乎无法通过这个错误,所以我认为这些方法一定是过时了,或者我做了一些非常错误的事情。

下面是我的代码:

代码语言:javascript
复制
import * as firebase from 'firebase'
const Firebase = firebase.initializeApp(firebaseConfig);
export default Firebase

这里是我得到错误的地方:

代码语言:javascript
复制
Token : Firebase.messaging().getToken()

我不确定我是否遗漏了一些依赖或任何类似的东西,因此任何帮助都将非常感谢。我已经直接从firebase文档中安装了一些东西,比如web,到目前为止一直在运行。

我也在使用expo托管的原生react

谢谢

另外,有没有更好的在后台使用事件侦听器发送通知的替代方法?

EN

回答 3

Stack Overflow用户

发布于 2020-11-16 17:15:48

自从你发帖以来已经有一段时间了,但我也经历了同样的错误,所以我将分享一些关于它的发现。您正在寻找的解决方案是项目符号3。

1) Firebase JavaScript SDK用于Node.js应用程序开发工具包()。尽管firebase sdk包可以像react-native/expo项目中的任何其他npm包一样直接安装和使用,但它意味着可以在浏览器或node.js运行时运行。

这特别令人困惑,因为一些firebase Api方法(例如firebase.auth和firebase.database)可以在本地应用程序上工作,而其他方法则不能。

事实上,firebase sdk官方文档页面没有react-native部分。如果你查看JavaScript section,并点击将Firebase添加到你的JavaScript项目中,你会看到目标用户包括web应用程序和node.js桌面应用程序(不确定IoT应用程序在哪个运行时运行):

如果您仍然想使用firebase sdk,那么您应该考虑像React Native Firebase这样的库,它旨在解决在node.js运行时之外使用JavaScript sdk的问题。我还没有尝试过,但看看他们的网站,看起来要整合到世博会管理的工作流程中并不容易。

2)导入@firebase/messaging也不是一个选项:正如this answer中所建议的,显式导入messaging模块不会解决react-native/expo项目的问题。同样,如上所述,因为本机应用程序不能在node.js/浏览器运行时运行。事实上,它让事情变得更糟,因为它试图加载不可用的依赖项:

代码语言:javascript
复制
[09:56:33] ReferenceError: Can't find variable: IDBIndex

3)在expo中获取用户设备通知推送令牌:由于您已经在使用expo,您可以使用expo-notifications模块获取设备推送令牌,它将返回令牌,然后您可以从云函数中使用该令牌通过firebase-admin sdk发送通知。下面是一些示例代码,用于获取推送令牌并将其存储在实时数据库中(稍后将在云函数中使用):

代码语言:javascript
复制
import * as Notifications from 'expo-notifications';
import * as Permissions from 'expo-permissions';
import firebase from 'firebase';

export const getDevicePushToken = () => {
    return Permissions.getAsync(Permissions.NOTIFICATIONS)
        .then((response) =>
            response.status === 'granted'
                ? response
                : Permissions.askAsync(Permissions.NOTIFICATIONS)
        )
        .then((response) => {
            if (response.status !== 'granted') {
                return Promise.reject(new Error('Push notifications permission was rejected'));
            }

            return Notifications.getDevicePushTokenAsync();
        })
        .then(token => {
            firebase.database().ref('...').update({ pushToken: token.data });
        })
        .catch((error) => {
            console.log('Error while registering device push token', error);
        });
};

干杯!

票数 3
EN

Stack Overflow用户

发布于 2021-08-06 16:01:22

当我尝试使用jest编写单元测试并模仿firebase-admin时,我得到了类似的消息。

我正在写我的版本,以防它对某人有帮助。

我在嘲笑firebase-admin时遇到了错误。我开玩笑嘲笑了firebase-admin,如下所示:

代码语言:javascript
复制
jest.mock('firebase-admin');

但我开始收到以下错误:

代码语言:javascript
复制
firebase_admin_1.default.messaging is not a function

它的出现是因为在应用程序代码中,我像这样使用了firebase-admin

代码语言:javascript
复制
await admin.messaging().send(message) 

(message是TokenMessage的实例)

问题是我没有模仿成员变量和成员方法。这里是成员方法messagingmessaging中的一个名为send的嵌套成员方法。(请参见在admin上调用messaging方法,然后在admin.messaging()的值上调用send )。所有需要做的就是模仿它们,如下所示:

代码语言:javascript
复制
jest.mock('firebase-admin', () => ({
  credential: {
    cert: jest.fn(),
  },
  initializeApp: jest.fn(),
  messaging: jest.fn().mockImplementation(() => {
    return {
      send: jest
        .fn()
        .mockReturnValue('projects/name_of_project/messages/message_id'),
    };
  }),
}));

(请注意,我还根据我的原始需求模拟了其他成员变量/方法。您可能也需要这些mock)

票数 1
EN

Stack Overflow用户

发布于 2021-11-20 14:13:18

Firebase针对react本机版本0.6 +进行了自我更新,并将在以下解决方案中工作。

代码语言:javascript
复制
import { firebase } from '@react-native-firebase/messaging';
await firebase.messaging().registerDeviceForRemoteMessage();
firebase.messaging().getToken();

解决方案2:-

代码语言:javascript
复制
import messaging from '@react-native-firebase/messaging';
await messaging(). registerDeviceForRemoteMessage ();
await messaging().getToken();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61300018

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档