Javascript 如何制作一个可以在云函数中的其他函数中调用的函数?

Javascript 如何制作一个可以在云函数中的其他函数中调用的函数?,javascript,firebase,google-cloud-functions,Javascript,Firebase,Google Cloud Functions,我有以下情况,当删除任何数据时,如果发送请求的用户已删除,我需要删除应用程序徽章(此时我使用静默推送通知删除它们,并使用云功能减少应用程序徽章编号)。但由于删除的用户可以向不同位置的不同用户发送多个请求,因此我决定需要创建一个函数,该函数将在firebase数据库触发器函数中调用,并且它将有助于避免在任何地方重复相同的代码 该函数将是这样的近似值 function adminRemoveAppBadge(userID, dataID, categoryID) { }; 例如,在这个函数中调用

我有以下情况,当删除任何数据时,如果发送请求的用户已删除,我需要删除应用程序徽章(此时我使用静默推送通知删除它们,并使用云功能减少应用程序徽章编号)。但由于删除的用户可以向不同位置的不同用户发送多个请求,因此我决定需要创建一个函数,该函数将在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函数只是JS,所以包含代码工作的正常路径

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

/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)
      }
    })
  })
}
...
}

Google函数只是JS,所以包含代码工作的正常路径

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

/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)
      }
    })
  })
}
...
}

@Alexander-使用我的SendMail.js文件中的相关代码编辑了答案。非常感谢@Alexander-使用我的SendMail.js文件中的相关代码编辑了答案。非常感谢!