0

Node.jsファイルを作成してFCMの通知で通知を送信しました。ファイルをFirebaseの「機能」セクションにアップロードしました。正しく動作します。データベースは、デバイスに通知を送信します。Node.jsを使用した複数のFirebase通知

問題は、同じ通知を何回(3〜10回)送信するかという問題です。

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

誰かがデータベースに通知要求を書き込みするたびに、あなたは、データベースからすべての通知要求を読んで、それらを送信し、それらを削除します。

これはNode.jsの私のコードです。これにより、別の通知要求を処理しているときに新しい通知要求を受信すると競合状態になる可能性があります。

代わりに、個々の通知要求に単に応答する必要があります。また、これはうまくあなたのコードを簡素化:

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

私の間違いは誤ってコードを挿入していた、おそらく疲労のため。 私はそれを書き直して、それは完全に働いた。 **ありがとうございました、私は非常に感謝しています!** –

関連する問題