2017-08-07 3 views
0

Ich habe den folgenden Fall, wenn ich Daten lösche, muss ich die App-Badges löschen (im Moment lösche ich sie mit Silent Push Notication und reduzieren die App-Badges-Nummer mit der Cloud-Funktion), wenn der Benutzer, der die Anfrage gesendet hat gelöscht. Aber da der Benutzer, der löschte, mehrere Anfragen an verschiedene Benutzer an verschiedenen Orten senden konnte, entschied ich, dass ich eine Funktion erstellen muss, die in fire base database trigger-Funktionen aufgerufen wird, und es wird auch helfen, den gleichen Code nicht überall zu duplizieren.Wie kann man eine Funktion erstellen, die in anderen Funktionen in Cloud Functions aufgerufen werden kann?

wird die Funktion so

function adminRemoveAppBadge(userID, dataID, categoryID) { 

}; 

Und zum Beispiel nennt sie in dieser Funktion

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'); 
    }; 
}); 

Auch Funktionen sind in verschiedenen Dateien annähernd. Wie kann ich es in anderen Firebase-Cloud-Funktionen aufrufen und wie stelle ich diese Funktion bereit?

aktualisieren Ich habe versucht, so eine der Optionen zu tun, wie here und here geschrieben, aber als ich versuchte, bekam ich einen Fehler zu tun bereitstellen kann nicht Modul ‚AppBadges/adminRemoveAppBadge.js‘ finden.

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

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

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

diese Funktion Gewünscht so

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

und diese Funktionen aufrufen, so

adminRemoveAppBadgeModule.adminRemoveAppBadge(cardOwnerID, cardID, 0); 

Antwort

2

Google-Funktionen sind nur JS - so normalen Routen Code Arbeit aufzunehmen.

ich meine "Bibliothek" Funktionen in einem Ordner /lib So sieht meine Funktionen Ordner wie folgt aus:

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

In meinem index.js schließe ich nur meinen Code:

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)) 

EDIT hinzugefügt /lib/SendMail.js code:

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) 
     } 
    }) 
    }) 
} 
... 
} 
+0

Bitte zeigen Sie wha t Ihre SendMail sieht aus wie – Alexander

+0

@Alexsander - Bearbeitete die Antwort mit dem entsprechenden Code aus meiner SendMail.js-Datei. – JoeManFoo

+0

Vielen Dank! – Alexander

Verwandte Themen