- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我的 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"
}
和乌腾特:
"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” Node ,然后重新查询以获得 Regione 值。只需查询上层 Node ,即 "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;
}
});
来自 Firebase 团队的视频: 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
关于node.js - Firebase 云函数脚本未运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50306057/
我正在学习构建单页应用程序 (SPA) 所需的所有技术。总而言之,我想将我的应用程序实现为单独的层,其中前端仅使用 API Web 服务(json 通过 socket.io)与后端通信。前端基本上是
当我看到存储在我的数据库中的日期时。 这是 正常 。日期和时间就是这样。 但是当我运行 get 请求来获取数据时。 此格式与存储在数据库 中的格式不同。为什么会发生这种情况? 最佳答案 我认为您可以将
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我正在尝试使用backbone.js 实现一些代码 和 hogan.js (http://twitter.github.com/hogan.js/) Hogan.js was developed ag
我正在使用 Backbone.js、Node.js 和 Express.js 制作一个 Web 应用程序,并且想要添加用户功能(登录、注销、配置文件、显示内容与该用户相关)。我打算使用 Passpor
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 8 年前。 Improve this ques
我尝试在 NodeJS 中加载数据,然后将其传递给 ExpressJS 以在浏览器中呈现 d3 图表。 我知道我可以通过这种方式加载数据 - https://github.com/mbostock/q
在 node.js 中,我似乎遇到了相同的 3 个文件名来描述应用程序的主要入口点: 使用 express-generator 包时,会创建一个 app.js 文件作为生成应用的主要入口点。 通过 n
最近,我有机会观看了 john papa 关于构建单页应用程序的精彩类(class)。我会喜欢的。它涉及服务器端和客户端应用程序的方方面面。 我更喜欢客户端。在他的实现过程中,papa先生在客户端有类
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我是一个图形新手,需要帮助了解各种 javascript 2D 库的功能。 . . 我从 Pixi.js 中得到了什么,而我没有从 Konva 等基于 Canvas 的库中得到什么? 我从 Konva
我正在尝试将一些 LESS 代码(通过 ember-cli-less)构建到 CSS 文件中。 1) https://almsaeedstudio.com/ AdminLTE LESS 文件2) Bo
尝试查看 Express Passport 中所有登录用户的所有 session ,并希望能够查看当前登录的用户。最好和最快的方法是什么? 我在想也许我可以在登录时执行此操作并将用户模型数据库“在线”
我有一个 React 应用程序,但我需要在组件加载完成后运行一些客户端 js。一旦渲染函数完成并加载,运行与 DOM 交互的 js 的最佳方式是什么,例如 $('div').mixItUp() 。对
请告诉我如何使用bodyparser.raw()将文件上传到express.js服务器 客户端 // ... onFilePicked(file) { const url = 'upload/a
我正在尝试从 Grunt 迁移到 Gulp。这个项目在 Grunt 下运行得很好,所以我一定是在 Gulp 中做错了什么。 除脚本外,所有其他任务均有效。我现在厌倦了添加和注释部分。 我不断收到与意外
我正在尝试更改我的网站名称。找不到可以设置标题或应用程序名称的位置。 最佳答案 您可以在 config/ 目录中创建任何文件,例如 config/app.js 包含如下内容: module.expor
经过多年的服务器端 PHP/MySQL 开发,我正在尝试探索用于构建现代 Web 应用程序的新技术。 我正在尝试对所有 JavaScript 内容进行排序,如果我理解得很好,一个有效的解决方案可以是服
我是 Nodejs 的新手。我在 route 目录中有一个 app.js 和一个 index.js。我有一个 app.use(multer....)。我还定义了 app.post('filter-re
我正在使用 angular-seed用于构建我的应用程序的模板。最初,我将所有 JavaScript 代码放入一个文件 main.js。该文件包含我的模块声明、 Controller 、指令、过滤器和
我是一名优秀的程序员,十分优秀!