0

J'ai créé un fichier Node.js pour envoyer des notifications à l'aide de FCM, j'ai téléchargé le fichier dans la section "Fonctions" de Firebase, il fonctionne correctement, quand il trouve un changement dans le base de données, il envoie une notification aux appareils.Notifications Firebase multiples avec Node.js

Le problème est qu'il envoie la même notification trop de fois (entre 3 et 10).

ceci est mon code Node.js:

var admin = require("firebase-admin"); 
var request = require('request'); 
const functions = require('firebase-functions'); 
var API_KEY = "<KEY>"; 

admin.initializeApp({ 
    credential: admin.credential.cert({ 
    projectId: "projectId", 
    clientEmail: "clientEmail", 
    privateKey: "privateKey" 
    }), 
    databaseURL: "https://database.firebaseio.com/" 
}); 

exports.backendDeNotificaciones = functions.database.ref('/solicitudDeNotificaciones').onWrite(event => { 


ref = admin.database().ref(); 
function EsperandoNotificaciones() 
{ 
console.log("Esperando Notificaciones"); 
var requests = ref.child('solicitudDeNotificaciones'); 
requests.on('child_added', function(requestSnapshot) 
{ 
    var request = requestSnapshot.val(); 
    enviarNotificacion(
    request.username, 
    request.message, 
    function() 
    { 
    requestSnapshot.ref.remove(); 
    }); 
}, function(error) 
    { 
    console.error(error); 
    }); 
}; 


function enviarNotificacion(username, message, onSuccess) { 
    request({ 
    url: 'https://fcm.googleapis.com/fcm/send', 
    method: 'POST', 
    headers: { 
    'Content-Type' :' application/json', 
    'Authorization': 'key='+API_KEY 
    }, 
    body: JSON.stringify({ 
    notification: { 
    title: message 
    }, 
    to : '/topics/TOPIC_NAME' 
    }) 
    }, function(error, response, body) { 
    if (error) { console.error(error); } 
    else if (response.statusCode >= 400) { 
    console.error('Error de HTTP: '+response.statusCode+' — '+response.statusMessage); 
    } 
else { 
    onSuccess(); 
    console.log("Notificación Enviada :)"); 
} 
}); 
} 
EsperandoNotificaciones(); 

}); 
+0

au lieu de tirer chaque fois qu'il ya un enfant ajouté, peut-être vous devez envoyer une fois par heure, de sorte que vous prenez un instantané de la collection toutes les heures puis de l'envoyer; ** ou peut-être que vous pourriez suivre (à qui et le nombre de fois) le message a été envoyé ** – Lamar

Répondre

0

Chaque fois que quelqu'un écrit une demande de notification à la base de données, vous lisez toutes les demandes de notification de la base de données, les envoyer et de les supprimer. Cela peut entraîner des conditions de concurrence lorsque vous recevez une nouvelle demande de notification pendant le traitement d'une autre.

Vous devriez simplement répondre à chaque demande de notification individuelle. Cela simplifie également bien votre code:

exports.backendDeNotificaciones = 
functions.database.ref('/solicitudDeNotificaciones/{messageId}').onCreate(event => { 
    var request = event.data.val(); 
    enviarNotificacion(
     request.username, 
     request.message, 
     function() { 
     event.data.ref.remove(); 
     }); 
    }, function(error) { 
     console.error(error); 
    }); 
    }; 
}); 
+0

Wow! l'auteur de l'article que j'ai essayé de suivre! Je suis gêné de dire que j'ai essayé de modifier mon code avec l'aide que vous avez fournie, mais je n'ai pas réussi, je suis nouveau à l'apprentissage de JavaScrip. Je vous serais très reconnaissant si vous me montriez la bonne façon d'ajouter le code. –

+0

Quel est le problème lorsque vous utilisez l'extrait que je partageais tout à l'heure? Est-ce que ça donne une erreur? Si oui, quel est le message d'erreur? –

+0

Mon erreur a été d'insérer le code par erreur, peut-être à cause de la fatigue. Je l'ai réécrit et ça a fonctionné parfaitement. ** Merci beaucoup pour l'aide, je suis très reconnaissant! ** –