Firebase云功能脚本未运行

时间:2018-05-12 12:07:44

标签: node.js firebase firebase-realtime-database google-cloud-functions

我的firebase数据库中有两个对象:

区域设置:

"39A81620-80EB-411B-80E2-C482824B7EF5" : {
      "Abilitato" : true,
      "Cap" : "00193",
      "Città" : "Roma",
      "ColoreFont" : "Bianco",
      "ColorePagina" : "Nero",
      "Descrizione" : "",
      "EmailLocale" : "test@gmail.com",
      "Font" : "Deco Future Black",
      "ImmagineCopertina" : "test_image",
      "Indirizzo" : "Via Dei Cosmati 3",
      "Latitudine" : 41.9053562,
      "Longitudine" : 12.4732003,
      "Nascosto" : false,
      "Nome" : "GUS",
      "PaginaFacebook" :"",
      "Proprietario" : "Eoh5yGzaPxWtZRiq7HAZL5WRu592",
      "Regione" : "Lazio",
      "SitoWeb" : "",
      "Telefono" : "06 8692 9033"
    }

和Utente:

"DDyGMUkbWjf8ucEQxNaxvI1wWPS2" : {
      "Cellulare" : "3300000000",
      "Citta" : "Roma",
      "Cognome" : "Zollo",
      "Compleanno" : 864597600,
      "ConversioniRimaste" : 2,
      "FBLiked" : false,
      "FBShared" : false,
      "ImmagineProfilo" : "https://firebasestorage.googleapis.com/v0/b/hangover-e0428.appspot.com/o/Utenti%2FDDyGMUkbWjf8ucEQxNaxvI1wWPS2%2FFoto%2FImmagineProfilo%2FImmagineProfilo.jpg?alt=media&token=5e31ef8f-7ab5-4bee-aa48-8ee0687a23f1",
      "LikeTotali" : 0,
      "Nome" : "Davide",
      "NuoviLike" : 0,
      "Privacy" : false,
      "PuntiHangover" : 0,
      "Regione" : "Lazio",
      "Sesso" : "Maschio",
      "isPR" : false,
      "token" : "eiL9ca2vXw8:APA91bFK4LHawfdqm_z0Ok0gRl-wHGaVhVjqNhjUXQtIJDqwqEAOKbJRUG1q8DkoviCBV1k4rYLlqmlCXaWiZQDBemJKH4rTb9sACawLs8D_7GE_TexmwHspYc8GsWxRAkPrjT3NbsUN"
    }

每当Locale从hidden变为visible时,“Nascosto”属性从true变为false,我想通知用户Locale是如此开放所以我有这个云函数:

//Rileva quando un locale passa da nascosto a visisbile e manda una notifica a tutti gli utenti della regione
exports.riAperturaLocale = functions.database.ref("Locali/{IDLocale}/Nascosto").onWrite(event =>{

    let stato_apertura = event.data.toJSON(); // valore di apertura o chiusura
    let ID_Locale = event.params.IDLocale;
    let nascosto = Boolean(stato_apertura);

    if(!nascosto) // il locale sta aprendo
    {
        console.log("Il Locale sta aprendo...")
        let locale = admin.database().ref("Locali").child(ID_Locale).once('value');
        return locale.then(snap =>{

            let dati_locale = snap.val();
            let regione = dati_locale["Regione"];

            ottieniUtentiRegioneLocale(dati_locale,regione);
        })

    }else{
        console.log("Il Locale sta chiudendo...:");
    }

    return 0;

})

//Ottiene un elenco di utenti nella regione del locale passato come parametro
function ottieniUtentiRegioneLocale(Locale,RegioneLocale){

    console.log("Notifico utenti per apertura locale...");

    let tutti_utenti = admin.database().ref("Utenti").once('value');
    return tutti_utenti.then(snap =>{

        console.log("Leggo utenti");
        var da_notificare = []// contiene gli Utenti da notificare

        snap.forEach((child) => {

            console.log("confronto utenti...");

            let IDUtente = String(child.key); // ID dell'Utente corrente
            let ValoriUtente = child.toJSON(); //Valori dell'utente che si sta scansionando

            let regione_user = ValoriUtente["Regione"];

            if(regione_user == RegioneLocale){
                da_notificare.push(IDUtente);
            }
        })

        if(da_notificare.length != 0){

            da_notificare.forEach((user) => {

                let img = Locale["ImmagineCopertina"];
                // creo la notifica 
                let testo = Locale["Nome"] + " " + "di" + " " + Locale["Città"] + " ha aperto, " 
                + "entra a scoprire tutti gli Eventi!"; 

                notificaUtente(user,"Un nuovo Locale ha aperto!",testo,img,"notifica");

            })

        }else{
            console.log("Non ci sono utenti da notificare...");
        }

    })

}

//Invia una notifica all'Utente passato come parametro
function notificaUtente(IDUtente,titolo,testo,URL,tipo){

    console.log("mando notifica a: " + IDUtente);

    let TokenDispositivo = admin.database().ref("Utenti").child(IDUtente).child("token").once('value');
    return TokenDispositivo.then(snap =>{

        let token = String(snap.val());

        // Notification details.
        const payload = {
             notification: {
                title: titolo,
                body: testo,
                sound: 'default',
                badge:"1"
            },
            data:{"tipo":tipo,
                    "url":URL,
                "testo":testo,
                "titolo":titolo,
            "mittente":IDUtente}
        };

        admin.messaging().sendToDevice(token, payload).then(response => {
            const error = response.error;
            if (error){
                console.log("Errore notifica" + error);
            }
        })
    })
}

请注意,notificaUtente()适用于其他函数;无论何时调用这些函数,它们都应该扫描所有具有“Regione”属性的用户,该属性与Locale的“Regione”相同,但是当代码执行时,它不会通过“console.log(”Leggo utenti“);”代码行,这里是firebase控制台输出:

Firebase console output

enter image description here

为什么呢?我是node.js的新手,我需要一点帮助谢谢。

1 个答案:

答案 0 :(得分:1)

我建议您按如下方式重构云功能。你不需要:

a / do event.data.toJSON()。数据已作为event.data.val()

的JavaScript对象提供

b /查看“Nascosto”节点,然后重新查询以获得Regione值。只需查询上层节点,即"Locali/{IDLocale}"

c /获取所有Utenti并循环遍历它们以找到具有该区域的那些。只需构建一个查询来获取它们。

exports.riAperturaLocale = functions.database.ref("Locali/{IDLocale}")
.onWrite(event => {
    const ID_Locale = event.params.IDLocale;
    const nascosto = event.data.val().Nascosto;

        if (!nascosto) {   // il locale sta aprendo

            const regione = event.data.val().Regione;

            const query = admin.database().ref("Utenti").orderByChild('Regione').equalTo(regione).once('value');

            return query.once('value').then(snap => {

                const notificationPromises = [];

                snap.forEach(childSnapshot => {

                    const userKey = childSnapshot.key;

                    const token = childSnapshot.val().token;

                    const img = Locale["ImmagineCopertina"];
                    // creo la notifica
                    const testo = Locale["Nome"] + " " + "di" + " " + Locale["Città"] + " ha aperto, "
                        + "entra a scoprire tutti gli Eventi!";

                    const titolo = 'Un nuovo Locale ha aperto!';                      

                    const payload = {
                                notification: {
                                    title: titolo,
                                    body: testo,
                                    sound: 'default',
                                    badge:"1"
                                },
                                data:{tipo: 'notifica',
                                    url: img,
                                    testo: testo,
                                    titolo: titolo,
                                    mittente:userKey
                                }
                            };

                    const p = admin.messaging().sendToDevice(token, payload);
                    notificationPromises.push(p);

                });

                return Promise.all(notificationPromises);

            }).catch(error => {
                console.log(error);
                //other error treatment
            });

        } else {
            console.log("Il Locale sta chiudendo...:");
            return false;
        }

    });

Firebase团队的视频: https://www.youtube.com/watch?v=7IkUgCLr5oA&list=PLl-K7zZEsYLkPZHe41m4jfAxUi0JjLgSM&index=1https://www.youtube.com/watch?v=652XeeKNHSk&index=2&list=PLl-K7zZEsYLkPZHe41m4jfAxUi0JjLgSM以及https://www.youtube.com/watch?v=d9GrysWH1Lc&index=3&list=PLl-K7zZEsYLkPZHe41m4jfAxUi0JjLgSM

最后一点:请注意,云功能已更新至1.0.x版,语法已更改。您可以根据以下文档调整功能代码:https://firebase.google.com/docs/functions/beta-v1-diff