0

こんにちは、firebaseクラウド関数はprevious.exists()のチェックを入れていないときに何度も呼び出されます。 複数のプッシュ通知が表示されます。firebaseクラウド関数が複数回呼び出されました

if (!event.data.exists()){ 
    return; 
} 
if (event.data.previous.exists()){ 
    return; 
} 

しかし、私はそれをチェックするときにプッシュ通知を取得しません。 ここには動作しないコードがあります: 変更する必要はありますか?

exports.sendShoppingListInvitationNotification = functions.database.ref('/invites/{id}/').onWrite(event => { 
//get the snapshot of the written data 
const snapshot = event.data; 

if (!event.data.exists()){ 
    return; 
} 
if (event.data.previous.exists()){ 
    return; 
} 

    //get snapshot values 
    console.log(snapshot.key); 
const receiptToken = snapshot.child('receiptFcmToken').val(); 
const senderName = snapshot.child('senderNickname').val(); 
const inviteMessage = snapshot.child('inviteMessage').val(); 
const senderImage = snapshot.child('senderProfileImageURL').val(); 


//create Notification 
const payload = { 
    notification: { 
     title: `Invitation from ${senderName}`, 
     body: `${inviteMessage}`, 
     icon: `${senderImage}`, 
     badge: '1', 
     sound: 'default', 
    } 
};    

//send a notification to firends token 
return admin.messaging().sendToDevice(receiptToken, payload).then(response => { 
    console.log("Successfully sent message:", response); 
}).catch((err) => { 
    console.log(err); 
}); 
}); 

クラウドコンソールでエラーメッセージが表示されません。 enter image description here

答えて

5

は、あなたがその場所に複数の書き込みをやっている場合を除き、それが複数回呼び出されるべきではないように思える:

これはfirebase構造です。パスへの最初の書き込み時にのみ通知を送信する場合は、.onWriteの代わりに.onCreateを使用してください。その後、以前のデータを確認する必要はありません。さまざまなデータベース・トリガーの概要を示す資料hereを参照してください。

+0

素晴らしいアイデア。私はちょうどあなたのチュートリアルを見ました。専門家が答えを得ることはその名誉です。 –

+0

悲しい私は今私のデータを取得していない。 onCreate関数は、receiptFcmTokenにnullを返します。エラー:sendToDevice()に提供された登録トークンは、空でない文字列または空でない配列でなければなりません。 –

+0

私は、私がonWriteを呼び出すときに私の考えを持っていると思う私の関数は、各子ノードが追加されたときにそれを実行します。 onCreateは、作成されたばかりの子ノードが追加される前に空のノードを配信します。しかし、どのように私は子供の値を取得します。 Iamは少し混乱しました。 –

関連する問題