0

我创建了一个Node.js文件来发送通知与FCM的帮助,我上传文件到“功能”部分的Firebase,它工作正常,当它发现一个变化数据库它发送一个通知给设备。多个Firebase通知与Node.js

问题是,它发送同样的通知太多次了(在3到10之间)。

这是我的代码的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

相反射击每一次有个孩子加入,也许你应该每隔一小时发一次,所以你把收集每隔一小时,然后将其发送的快照; **或者也许你可以跟踪(消息发送的人数和次数)** – Lamar

回答

0

每当有人写了一个通知,要求数据库,从数据库中读取所有通知要求,给他们,并将其删除。当您在处理另一个通知请求时收到新的通知请求时,这可能会导致竞争条件。

您应该简单地回应每个单独的通知请求。这也很好地简化了代码:

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

哇!我试图遵循的文章的作者! 我很尴尬地说,我试图用你提供的帮助来修改我的代码,但是我没有成功,我是学习JavaScrip的新手。如果你能告诉我我必须添加代码的正确方法,我将非常感激。 –

+0

当您使用我刚才共享的代码段时,有什么问题?它会给出错误吗?如果是这样,那么错误信息是什么? –

+0

我的错误是错误地插入了代码,可能是因为疲劳。 我改写了它,它完美地工作。 **非常感谢您的帮助,我非常感谢!** –