【问题标题】:How to Save Payload after sending a notifications in cloud functions?在云功能中发送通知后如何保存有效负载?
【发布时间】:2019-11-30 17:05:13
【问题描述】:

如何在将有效负载发送到特定节点“通知/”中的特定令牌后保存有效负载,以便稍后在单个屏幕中检索它, 而且省得很好,

但是当我收到通知时,当我声明一个变量“providerName”时,我看到 providerName 为 undefined

const functions = require("firebase-functions");
const admin = require("firebase-admin");
var serviceAccount = require("./serviceAccountKey.json");
admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: "https://khadamatiapp-42657.firebaseio.com"
});

exports.acceptedOrder = functions.database
  .ref("/AcceptedOrders/{pid}/{orderid}")
  .onCreate(async (snapshot, context) => {
    const registrationTokens = snapshot.val().userToken;
    // const event = context.params;
    const pid = context.params.pid;
    console.log("@pid", pid);

    const username = snapshot.val().username;
    const userUid = snapshot.val().userUid;
    var providerName;
    admin
      .database()
      .ref(`providers/${pid}`)
      .once("value")
      .then(snapshot => {
        providerName = snapshot.val().username;
        console.log("pName", providerName); // here i got ProviderOne
      });

    console.log("@providerName", providerName); //here i got undefined

    const payload = {
      notification: {
        from: pid,
        to: userUid,
        title: "New Order",
        body: `Hi ${username}, You Order is Accepted from ${providerName}, check it now! `
//Hi userOne, You Order is Accepted from ***Undefined***, check it now! 
      }
    };
    try {
      let notification = payload.notification;
      const response = await admin
        .messaging()
        .sendToDevice(registrationTokens, payload)
        .then(() => {
          admin
            .database()
            .ref(`Notifications/${userUid}`)
            .push({ notification });
        });
      console.log("Successfully sent message:", response);
    } catch (error) {
      console.log("Error sending message:", error);
    }
    return null;
  });

更新

我有三个函数,它是同一个根中的触发器, 现在 acceptedOrderFromProvider 在“AcceptedOrders”根中创建新元素并发送推送通知时调用

另一个函数是 CompletedOrderFromProvider,如果状态发生变化,它会触发,发送通知我使用 onUpdate 装配器,但不能正常工作, 它在创建或更新每个元素时调用,

那么如何在某些字段“状态”发生变化时强制它调用呢? 看这里图片

exports.acceptedOrderFromProvider = functions.database
  .ref("/AcceptedOrders/{pid}/{orderid}")
  .onCreate(async (snapshot, context) => {
    const registrationTokens = snapshot.val().userToken;
    // const event = context.params;
    const pid = context.params.pid;
    // console.log("@pid", pid);

    const username = snapshot.val().username;
    const userUid = snapshot.val().userUid;
    var providerName;
    admin
      .database()
      .ref(`providers/${pid}`)
      .once("value")
      .then(async snapshot => {
        providerName = snapshot.val().username;
        const payload = {
          notification: {
            from: pid,
            to: userUid,
            title: "Accepted Order",
            body: `Hi ${username}, You Order is Accepted from ${providerName}, check it now! `
          }
        };
        try {
          let notification = payload.notification;
          const response = await admin
            .messaging()
            .sendToDevice(registrationTokens, payload)
            .then(() => {
              admin
                .database()
                .ref(`Notifications/${userUid}`)
                .push({ notification });
            });
          console.log("Successfully sent message:", response);
        } catch (error) {
          console.log("Error sending message:", error);
        }
      });

    return null;
  });

exports.cancelledOrderFromProvider = functions.database
  .ref("/AcceptedOrders/{pid}/{orderid}")
  .onDelete(async (snapshot, context) => {
    const registrationTokens = snapshot.val().userToken;
    // const event = context.params;
    const pid = context.params.pid;
    // console.log("@pid", pid);

    const afterData = snapshot.val();
    // console.log(afterData);
    const username = snapshot.val().username;
    const userUid = snapshot.val().userUid;
    const nameOfProblem = snapshot.val().nameOfProblem;

    var providerName;
    admin
      .database()
      .ref(`providers/${pid}`)
      .once("value")
      .then(async snapshot => {
        providerName = snapshot.val().username;
        const payload = {
          notification: {
            from: pid,
            to: userUid,
            title: "Order Cancelled",
            body: `Hi ${username}, ${providerName} Cancelled your Order "${nameOfProblem}"!`
          }
        };
        try {
          let notification = payload.notification;
          const response = await admin
            .messaging()
            .sendToDevice(registrationTokens, payload)
            .then(() => {
              admin
                .database()
                .ref(`Notifications/${userUid}`)
                .push({ notification });
            });
          console.log("Successfully sent message:", response);
        } catch (error) {
          console.log("Error sending message:", error);
        }
      });

    return null;
  });

exports.CompletedOrderFromProvider = functions.database
  .ref("/AcceptedOrders/{pid}/{orderid}")
  .onUpdate(async (snapshot, context) => {
    console.log(snapshot.after.val());
    const registrationTokens = snapshot.after.val().userToken;
    const pid = context.params.pid;

    const username = snapshot.after.val().username;
    const userUid = snapshot.after.val().userUid;
    const nameOfProblem = snapshot.after.val().nameOfProblem;

    var providerName;
    admin
      .database()
      .ref(`providers/${pid}`)
      .once("value")
      .then(async snapshot => {
        providerName = snapshot.val().username;
        const payload = {
          notification: {
            from: pid,
            to: userUid,
            title: "Order Completed",
            body: `Hi ${username}, ${providerName} Completed your Order "${nameOfProblem}"! Check it Now`
          }
        };
        try {
          let notification = payload.notification;
          const response = await admin
            .messaging()
            .sendToDevice(registrationTokens, payload)
            .then(() => {
              admin
                .database()
                .ref(`Notifications/${userUid}`)
                .push({ notification });
            });
          console.log("Successfully sent message:", response);
        } catch (error) {
          console.log("Error sending message:", error);
        }
      });

    return null;
  });

【问题讨论】:

标签: javascript firebase firebase-realtime-database firebase-cloud-messaging google-cloud-functions


【解决方案1】:

.then() 中的代码是异步运行的,因此即使它出现在函数中其余代码的上方,也可能要到很久以后才会调用它。将所有适用于providerName 的代码放入.then() 回调中,以确保仅在检索到providerName 后调用它:

const functions = require("firebase-functions");
const admin = require("firebase-admin");
var serviceAccount = require("./serviceAccountKey.json");
admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: "https://khadamatiapp-42657.firebaseio.com"
});

exports.acceptedOrder = functions.database
  .ref("/AcceptedOrders/{pid}/{orderid}")
  .onCreate(async (snapshot, context) => {
    const registrationTokens = snapshot.val().userToken;
    // const event = context.params;
    const pid = context.params.pid;
    console.log("@pid", pid);

    const username = snapshot.val().username;
    const userUid = snapshot.val().userUid;
    var providerName;
    admin
      .database()
      .ref(`providers/${pid}`)
      .once("value")
      .then(snapshot => {
        providerName = snapshot.val().username;
        const payload = {
            notification: {
                from: pid,
                to: userUid,
                title: "New Order",
                body: `Hi ${username}, You Order is Accepted from ${providerName}, check it now! `
            }
        };
        try {
            let notification = payload.notification;
            const response = await admin
                .messaging()
                .sendToDevice(registrationTokens, payload)
                .then(() => {
                    admin
                    .database()
                    .ref(`Notifications/${userUid}`)
                    .push({ notification });
                });
            console.log("Successfully sent message:", response);
        } catch (error) {
            console.log("Error sending message:", error);
        }
      });

    return null;
  });

【讨论】:

猜你喜欢
  • 2021-09-27
  • 2019-02-23
  • 2016-07-19
  • 2020-09-28
  • 2021-10-20
  • 1970-01-01
  • 2021-04-04
  • 2018-05-19
  • 2019-10-12
相关资源
最近更新 更多