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

我的錯誤是錯誤地插入了代碼,可能是因爲疲勞。 我改寫了它,它完美地工作。 **非常感謝您的幫助,我非常感謝!** –