繁体   English   中英

如何制作可以在Cloud Functions中的其他函数中调用的函数?

[英]How to make a function that can be called in other functions in Cloud Functions?

我遇到以下情况,在删除任何数据时,如果发送请求的用户已删除,则需要删除应用程序徽章(目前我使用无声推送通知删除它们,并使用云功能减少应用程序徽章的数量)。 但是由于删除的用户可能会向不同地方的不同用户发送多个请求,因此我决定需要创建一个将在firebase数据库触发器函数中调用的函数,并且这将有助于避免在各处重复相同的代码。

该功能将是近似的

function adminRemoveAppBadge(userID, dataID, categoryID) {

};

例如,在此函数中调用它

module.exports = functions.database.ref('/cards/{cardID}/interestedUsers/{interestedUserID}').onWrite(event => {

    const currentData = event.data.current;
    const prevData = event.data.previous;

    const cardID = event.params.cardID;
    const interestedUserID = event.params.interestedUserID;

    if (currentData.val() && !prevData.val()) {
        // value created
        return console.log('cardInterestedUserHandler - created');
    } else if (!currentData.val() && prevData.val()) {
        // value removed
        console.log('cardInterestedUserHandler - removed', currentData.val());

        const cardRef = admin.database().ref("cards").child(cardID);
        const cardRefPromise = cardRef.once("value", function(snap, error) {
            if (error) {
              return error;
            };
            if (snap.val()) {
                const cardJSON = snap.val();
                const cardOwnerID = cardJSON["ownerID"];

                if (cardOwnerID) {
                    const cardOwnerAppBadgesRef = admin.database().ref("userAppBadges").child(cardOwnerID).child("appBadgeModels").orderByChild("dataID").equalTo(cardID);
                    const cardOwnerAppBadgesRefPromise = cardOwnerAppBadgesRef.once("value", function (cardOwnerAppBadgesRefSnap, error) {
                        if (error) {
                            return error;
                        };
                        if (cardOwnerAppBadgesRefSnap.val()) {
                            var deletingPromises = [];
                            cardOwnerAppBadgesRefSnap.forEach(function(cardOwnerAppBadgesRefSnapChild) {
                                const appBadgeModelJSON = cardOwnerAppBadgesRefSnapChild.val();
                                const appBadgeModelID = appBadgeModelJSON["id"];
                                const senderID = appBadgeModelJSON["senderID"];
                                if (appBadgeModelID && senderID) {
                                    if (senderID == interestedUserID) {
                                        const cardOwnerAppBadgeRef = admin.database().ref("userAppBadges").child(cardOwnerID).child("appBadgeModels").child(cardOwnerAppBadgeModelID);
                                        const cardOwnerAppBadgeRefPromise = cardOwnerAppBadgeRef.remove();
                                        deletingPromises.push(cardOwnerAppBadgeRefPromise);


                                        // to call 
                                        adminRemoveAppBadge
                                    };
                                } else {
                                    console.log("cardOwnerAppBadgeModelID == null");
                                };
                            });

                            return Promise.all(deletingPromises);
                        };
                    });
                    return Promise.all([cardOwnerAppBadgesRefPromise]);
                } else {
                  return console.log("owner id == null");
                };
            };
        });
        return Promise.all([cardRefPromise]);
    } else {
        return console.log('cardInterestedUserHandler - updated');
    };
});

功能也位于不同的文件中。 如何在其他Firebase云功能中调用它,以及如何部署此功能?

更新我尝试执行此处此处编写的选项之一,但是当我尝试进行部署时出现错误, 找不到模块'AppBadges / adminRemoveAppBadge.js'

const functions = require('firebase-functions');
const admin = require('firebase-admin');

exports.adminRemoveAppBadge = function (userID, dataID, categoryID) {

    console.log("adminRemoveAppBadge nil");
};

要求此功能

var adminRemoveAppBadgeModule = require("AppBadges/adminRemoveAppBadge.js");

并调用此函数

adminRemoveAppBadgeModule.adminRemoveAppBadge(cardOwnerID, cardID, 0);

Google Functions只是JS-因此包含代码工作的正常途径。

我将“库”函数放在文件夹/lib因此我的functions文件夹如下所示:

/functions
   /lib
       BuildImage.js
       SendEmail.js
index.js
package.json
...etc...

在我的index.js我只包含了我的代码:

const SendMail = require('./lib/SendMail')
const sendMail = new SendMail({
  database: db,
  mailgun: mailgun
})
exports.sendContactUsMessage = functions.database.ref('/contact-messages/{itemId}').onWrite(sendMail.send(event))

编辑添加了/lib/SendMail.js代码:

module.exports = class SendMail {
constructor(config) {
  if (!config) {
    throw new Error ('config is empty. Must pass database and mailgun settings')
  }
  if (!config.database) {
    throw new Error('config.database is empty. Must pass config.database')
  }
  if (!config.mailgun) {
    throw 'config.mailgun is empty. Must pass config.mailgun'
  }
  this.database = config.database
  this.mailgun = config.mailgun
}

sendEmail (emailData) {
  return new Promise((resolve, reject) => {
    this.mailgun.messages().send(emailData, (error, body) => {
      if (error) {
        if (debug) {
          console.log(error)
        }
        reject(error)
      } else {
        if (debug) {
          console.log(body)
        }
        resolve(body)
      }
    })
  })
}
...
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM