我的Firebase数据库中有两个对象:
语言环境:
"39A81620-80EB-411B-80E2-C482824B7EF5" : {
"Abilitato" : true,
"Cap" : "00193",
"Città" : "Roma",
"ColoreFont" : "Bianco",
"ColorePagina" : "Nero",
"Descrizione" : "",
"EmailLocale" : "[email protected]",
"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"
}
和用户:
"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"
}
每当区域设置从隐藏变为可见时,“ Nascosto”属性从true更改为false,我想通知用户该区域设置是如此开放,因此我具有以下云功能:
//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”属性相同的所有“ Regione”属性的用户,但是当执行代码时,它将不会运行通过“ console.log(“ Leggo utenti”);“ 代码行,这是firebase控制台的输出:
为什么?我是node.js的新手,几乎不需要帮助,谢谢。
我建议您如下重构您的云功能。您不需要:
a /执行event.data.toJSON()。数据已经可以作为JavaScript对象使用event.data.val()
b /查看“ Nascosto”节点,然后重新查询以获取Regione值。只需在上层节点(即)上查询即可"Locali/{IDLocale}"
。
c /获取所有的Utenti并在它们上循环以找到具有该区域的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;
}
});
从火力地堡队视频:https://www.youtube.com/watch?v=7IkUgCLr5oA&list=PLl-K7zZEsYLkPZHe41m4jfAxUi0JjLgSM&index=1和https://www.youtube.com/watch?v=652XeeKNHSk&index=2&list=PLl-K7zZEsYLkPZHe41m4jfAxUi0JjLgSM和https://www.youtube.com/watch?v=d9GrysWH1Lc&index=3&list=PLl-K7zZEsYLkPZHe41m4jfAxUi0JjLgSM
最后一点:请注意,Cloud Functions已更新至版本1.0.x,并且语法已更改。您可以根据以下文档相应地调整您的功能代码:https : //firebase.google.com/docs/functions/beta-v1-diff
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句