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

Firebase云函数与Cloud Firestore故障

楮阳
2023-03-14

我在以前的项目中使用过这个Firebase数据库代码:

const getDeviceUser = admin.database().ref(`/users/${notification.to}/`).once('value');

我现在正在尝试将其转换为FireStore。我基本上是试图让我的用户FCM的当一个通知正在发送。我尝试过很多事情,但还没有看到完成这件事的新方法。

编辑:这是我的代码。

exports.sendFavoriteNotification = functions.firestore.document('users/{userUid}/notifications/{notificationId}').onCreate(event => {
const notification = event.data.data();
const user = event.params.userUid;

const getDeviceUser = admin.database().ref(`/users/${notification.to}/`).once('value');

// Get the follower profile.
const getProfilePromise = admin.auth().getUser(notification.sender);

return Promise.all([getDeviceUser, getProfilePromise]).then(results => {
  const tokensSnapshot = results[0];
  const liker = results[1];

  // Check if there are any device tokens.
  if (!tokensSnapshot.hasChildren()) {
    return console.log('There are no notification tokens to send to.');
  }

  //console.log('There are', tokensSnapshot.numChildren(), 'tokens to send notifications to.');
  console.log('Fetched follower profile', liker);

  // Notification details.
  const payload = {
    notification : {
      title : 'You have a new like!',
      body : `${liker.displayName} just liked your photo.`,
      badge: '1',
      sound: 'default'
    }
  };

  // Listing all tokens.
  var tokens = admin.firestore.ref(`/users/${notification.to}/`).get('fcm');

  // Send notifications to all tokens.
  admin.messaging().sendToDevice(tokens.data(), payload);
  return admin.messaging().sendToDevice(tokens, payload).then(response => {
    // For each message check if there was an error.
    const tokensToRemove = [];
    response.results.forEach((result, index) => {
      const error = result.error;
      if (error) {
        console.error('Failure sending notification to', tokens[index], error);
        // Cleanup the tokens who are not registered anymore.
        if (error.code === 'messaging/invalid-registration-token' ||
            error.code === 'messaging/registration-token-not-registered') {
          tokensToRemove.push(tokensSnapshot.update({
            fcm: FieldValue.delete()
          }));
        }
      }
    });
    return Promise.all(tokensToRemove);
  });
});

});

共有1个答案

乐正浩宕
2023-03-14

希望这能有所帮助。这是我在学习如何从实时数据库转换到Firestore两天后编写的代码。它基于一个firebase项目:https://github.com/mahmoudalyudeen/firebaseim

let functions = require('firebase-functions');
let admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);


exports.sendNotificationToFirestone = functions.firestore.document('/notifications/{pushId}')
    .onCreate(event => {
        const pushId = event.data.id;
        const message = event.data.data();
        const senderUid = message.from;
        const receiverUid = message.to;
        const db = admin.firestore();

        if (senderUid === receiverUid) {
            console.log('pushId: '+ pushId);
            return db.collection('notifications').doc(pushId).delete();;
        } else {
            const ref = db.collection('users').doc(receiverUid);

            const query = new Promise(
                function (resolve, reject) {
                    ref.get()
                        .then(doc => {
                            if (!doc.exists) {
                                console.log('No such document!');
                                reject(new Error('No such document!'));

                            } else {
                                console.log('Document data:', doc.data().instanceId);
                                resolve(doc.data().instanceId);
                            }
                        })
                        .catch(err => {
                            console.log('Error getting document', err);
                            reject(err);
                        });
                });


            const getSenderUidPromise = admin.auth().getUser(senderUid);

            return Promise.all([query, getSenderUidPromise]).then(results => {
                //console.log('instanceId = Result[0]: ' + results[0]);
                //console.log('sender = Result[1]: ' + results[1]);
                const instanceId = results[0];
                const sender = results[1];
                //console.log('notifying ' + receiverUid + ' about ' + message.body + ' from ' + senderUid);
                //console.log('instanceId este' + instanceId);

                const payload = {
                    notification: {
                        title: sender.displayName,
                        body: message.body,
                        icon: sender.photoURL
                    }
                };

                admin.messaging().sendToDevice(instanceId, payload)
                    .then(function (response) {
                        console.log("Message sent: ", response);
                    })
                    .catch(function (error) {
                        console.log("Error sending message: ", error);
                    });
            });
        }
    });
 类似资料:
  • 我看到Cloud Functions引用实时数据库的增量计数器,但还没有看到Firebase FiRecovery。 我有一个侦听新文档的云功能: 我正在尝试上述事务,但当我在terminal中运行时,我得到以下错误: error Each then()应该返回一个值或抛出promise/always return函数predeploy error:命令以非零退出代码1终止 这是我第一次尝试任何节

  • 我已经使用firebase云函数一段时间了,今天在代码中修复了一个小错误,在尝试部署时出现了以下错误。我取消了该更改,并尝试使用上次提交的稳定更改再次部署,但仍然是相同的错误。有什么解决办法吗?PS:这是一个typescript项目,我用tsc编译它。

  • 在以前的GCP项目中,我们部署了基于Python的云功能(使用gcloud cli),理想情况下,我们希望继续使用Python实现Firebase云功能。所以我的问题是: > 是否可以部署基于Python的Firebase云功能?如果没有: 我们是否可以回到使用gcloud cli部署基于Python的GCP云函数,并且仍然让它们作为Firestore触发器工作?

  • 我正在编写云函数,Firez是这样自动导入的。 但在部署时,错误如下所示。我试着这样做,它部署没有任何错误,但我不确定这是正确的方式与否。 有人知道吗? node_modules/@googlecloud/firestore/types/firestore。d、 ts:28:15-错误TS2300:重复标识符“DocumentData”。 28导出类型DocumentData={[field: s

  • 在我正在开发的Firebase web应用程序中,我想从邮件地址获取用户ID。为此,我正在尝试编写一个云函数。但它不起作用,或者我没有正确使用它。以下是当前代码(基于我在网上找到的一些示例): 运行“firebase deploy”时,我看不到任何问题。然后,我尝试用各种方法测试该功能,就像我在本教程之后编写的演示应用程序一样。 例如(现有和不存在的邮件地址): 但在任何一种情况下,我都不会在We

  • 我试图部署一个PubSub函数: 在我第一次尝试部署该功能之前,云调度API被禁用。 它自动启用了。 PubSub也已启用。 由于Cloud Scheduler API和PubSub已经为项目启用。理想情况下,在部署函数时不应该有任何错误。错误确实提到了几分钟后尝试。但是自从我启用PubSub和Cloud Scheduler API以来,已经过去了24小时。 节点:v12。10 Firebase函