我想使用firebase云函数发送通知,所以我尝试使用firebase.messaging().getToken()获取令牌,但我一直收到错误:
TypeError: firebase.default.messaging不是函数(在'_firebase.default.messaging()‘中,'firebase.default.messaging is undefined)
我已经通过5种不同的方式安装了firebase和firebase/messages,但似乎无法通过这个错误,所以我认为这些方法一定是过时了,或者我做了一些非常错误的事情。
下面是我的代码:
import * as firebase from 'firebase'
const Firebase = firebase.initializeApp(firebaseConfig);
export default Firebase这里是我得到错误的地方:
Token : Firebase.messaging().getToken()我不确定我是否遗漏了一些依赖或任何类似的东西,因此任何帮助都将非常感谢。我已经直接从firebase文档中安装了一些东西,比如web,到目前为止一直在运行。
我也在使用expo托管的原生react
谢谢
另外,有没有更好的在后台使用事件侦听器发送通知的替代方法?
发布于 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/浏览器运行时运行。事实上,它让事情变得更糟,因为它试图加载不可用的依赖项:
[09:56:33] ReferenceError: Can't find variable: IDBIndex3)在expo中获取用户设备通知推送令牌:由于您已经在使用expo,您可以使用expo-notifications模块获取设备推送令牌,它将返回令牌,然后您可以从云函数中使用该令牌通过firebase-admin sdk发送通知。下面是一些示例代码,用于获取推送令牌并将其存储在实时数据库中(稍后将在云函数中使用):
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);
});
};干杯!
发布于 2021-08-06 16:01:22
当我尝试使用jest编写单元测试并模仿firebase-admin时,我得到了类似的消息。
我正在写我的版本,以防它对某人有帮助。
我在嘲笑firebase-admin时遇到了错误。我开玩笑嘲笑了firebase-admin,如下所示:
jest.mock('firebase-admin');但我开始收到以下错误:
firebase_admin_1.default.messaging is not a function它的出现是因为在应用程序代码中,我像这样使用了firebase-admin:
await admin.messaging().send(message) (message是TokenMessage的实例)
问题是我没有模仿成员变量和成员方法。这里是成员方法messaging和messaging中的一个名为send的嵌套成员方法。(请参见在admin上调用messaging方法,然后在admin.messaging()的值上调用send )。所有需要做的就是模仿它们,如下所示:
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)
发布于 2021-11-20 14:13:18
Firebase针对react本机版本0.6 +进行了自我更新,并将在以下解决方案中工作。
import { firebase } from '@react-native-firebase/messaging';
await firebase.messaging().registerDeviceForRemoteMessage();
firebase.messaging().getToken();解决方案2:-
import messaging from '@react-native-firebase/messaging';
await messaging(). registerDeviceForRemoteMessage ();
await messaging().getToken();https://stackoverflow.com/questions/61300018
复制相似问题