当前位置: 首页 > 知识库问答 >
问题:

在firebase云消息中获取这些错误

扈韬
2023-03-14

这是在使用Firebase消息传递推送通知时显示的错误...

Error: Exactly one of topic, token or condition is required
at FirebaseMessagingError.FirebaseError [as constructor] (/srv/node_modules/firebase-admin/lib/utils/error.js:42:28)

    Error: Exactly one of topic, token or condition is required
        at FirebaseMessagingError.FirebaseError [as constructor] (/srv/node_modules/firebase-admin/lib/utils/error.js:42:28)
        at FirebaseMessagingError.PrefixedFirebaseError [as constructor] (/srv/node_modules/firebase-admin/lib/utils/error.js:88:28)
        at new FirebaseMessagingError (/srv/node_modules/firebase-admin/lib/utils/error.js:254:16)
        at Object.validateMessage (/srv/node_modules/firebase-admin/lib/messaging/messaging-types.js:46:15)
        at Messaging.send (/srv/node_modules/firebase-admin/lib/messaging/messaging.js:208:27)
        at sendNotification (/srv/index.js:227:18)
        at exports.onCreateActivityFeedItem.functions.firestore.document.onCreate (/srv/index.js:197:13)
        at <anonymous>
        at process._tickDomainCallback (internal/process/next_tick.js:229:7)

这是Firebase消息的js代码

exports.onCreateActivityFeedItem = functions.firestore
.document('/feed/{userId}/feedItems/{activityFeedItem}')
.onCreate(async (snapshot, context) => {
    console.log('Activity Feed Item Created', snapshot.data());

这个日志是打印出来的。。。

// 1) Get user connected to the feed, 
//send notification if they have token
const userId = context.params.userId;

const userRef = admin.firestore().doc(`users/${userId}`);
const doc = await userRef.get();

// 2) Once we have user check if they have notification item
const androidNotificationToken = doc.data().androidNotificationToken;

const createdActivityFeedItem = snapshot.data();
if (androidNotificationToken) {
    // send notification
    sendNotification(androidNotificationToken, createdActivityFeedItem);
} else {
    console.log('User have no token, cant send notification');
}

function sendNotification(androidNotificationToken, activityFeedItem) {
    let body;
    // switch bod   y value base on notification item (like, comment or follow)
    switch (activityFeedItem.type) {
        case 'comment':
            body = `${activityFeedItem.username} replied: ${activityFeedItem.commentData}`;
            break;
        case 'like':
            body = `${activityFeedItem.username} liked your post.`;
        case 'follow':
            body = `${activityFeedItem.username} followed you.`;
        default:
            break;
    }

    // 4) create message for push notification
    const message = {
        notification: { body },
        token: { androidNotificationToken },
        data: { recipient: userId }
    };

    // 5) send message with admin.messaging
    admin
        .messaging()
        .send(message)
        .then((response) => {
            // Response is a message ID string.
            console.log('Successfully sent message:', response);
        })
        .catch((error) => {
            console.log('Error sending message:', error);
        });

}
});

这是颤振代码

configurePushNotifications() {
    final GoogleSignInAccount user = googleSignIn.currentUser;
    if (Platform.isIOS) {
      getIOSPermission();
    }
    _firebaseMessaging.getToken().then((token) {
      print('Token received: $token');
      usersRef.document(user.id).updateData({
        'androidNotificationToken': token,
      });

      _firebaseMessaging.configure(
        onMessage: (Map<String, dynamic> message) async {
          print('Message is : $message');
          final String recipientId = message['data']['recipient'];
          final String body = message['notification']['body'];

          if (recipientId == user.id) {
            print('Notification Shown');
            SnackBar snackbar = SnackBar(
              content: Text(
                body,
                overflow: TextOverflow.ellipsis,
              ),
            );
            _scaffoldKey.currentState.showSnackBar(snackbar);
          }
          print('Notification not shown');
        },
        //  onResume: (Map<String, dynamic> message) async {},
        //   onLaunch: (Map<String, dynamic> message) async {},
      );
    });
  }

获得ios权限,但我正在使用android手机进行调试

  getIOSPermission() {
    _firebaseMessaging.requestNotificationPermissions(
      IosNotificationSettings(
        alert: true,
        badge: true,
        sound: true,
      ),
    );
    _firebaseMessaging.onIosSettingsRegistered.listen((settings) {
      print('Settings registered: $settings');
    });
  }

onCreateActivityFeedItem活动源项已创建{commentData:'ab to man ja',mediaUrl:'https://firebasestorage.googleapis.com/v0/b/chautari-ccfba.appspot.com/o/post_dcc8a054-a972-4b88-8d3f-4802de74393a.jpg?alt=media

共有1个答案

华乐逸
2023-03-14

错误似乎来自JavaScript代码。更准确地说,这似乎是错的:

const message = {
    notification: { body },
    token: { androidNotificationToken },
    data: { recipient: userId }
};

如果您查看发送消息时的Firebase留档,它包含以下示例:

var message = {
  data: {
    score: '850',
    time: '2:45'
  },
  token: registrationToken
};

您正在将令牌包装在一个额外的{}中,这是不正确的,因为它会导致这个JSON:令牌:{androidNotificationToken:“ValueOfaDroidNotificationToken”}

更有可能需要:

const message = {
    notification: { body },
    token: androidNotificationToken,
    data: { recipient: userId }
};
 类似资料:
  • 我也在尝试使用node。js和firebase管理员向iOS设备发送推送通知。然而,我遇到了这个错误: 错误发送消息:{错误:请求包含一个无效的参数。在Firebase MessagingError。错误(本机)在Firebase MessagingError。Firebase Error[作为构造函数](/user_code/node_modules/fire base-admin/lib/ut

  • 在我的Android应用程序中,我收到使用Firebase发送的消息,问题不是所有消息都到达,有时消息到达非常慢。 在我的服务器端,我跟踪我发送到FCM的消息,我总是收到成功:来自FCM的1个响应,仍然有我在Android应用程序中没有收到的消息。 我认为FCM消息日志在上面描述的情况下会有很大的帮助,但我不确定是否存在此选项。 有办法浏览Firebase消息日志吗?

  • 在我们的项目中,我们使用Firebase云消息传递来进行推送通知,我们遇到了消息重复的问题。我们过程如下所示: xamarin.firebase.ios.CloudMessaging 3.1.2 xamarin.firebase.ios.instanceID 3.2.1 xamarin.firebase.ios.core 5.1.3 订阅用户主题推荐 发送主题订阅者请求的通知 null 但是,当用

  • 我在Spring引导中编写了这段代码(我使用的是Intellij IDE)。在代码androidFcmUrl="https://fcm.googleapis.com/fcm/send". androidFcmKey=我的服务器密钥. deviceToken=设备ID。 我正在获取状态500内部服务器错误。 2018-11-28 17:42:47.712错误15292---[nio-8088-exe

  • 有没有办法在Firebase控制台中重新生成FCM(云消息部分)的API Key?该密钥不可编辑,与Google API控制台中自动生成的密钥不同。由于这个错误的配置,我总是从FCM得到未经授权的401...

  • 我使用应用服务器通过Firebase Cloud Messaging发送消息。Firebase控制台不会列出由应用服务器发送的此类消息。当我使用Firebase控制台直接发送消息时,它会显示一些对其自身消息的分析。 问题是,当我使用应用服务器时,如何访问消息统计信息?