用于发送通知的云功能不起作用
Cloud function for sending notification not working
我正在尝试在添加新游戏时向 "PLAYER 2" 发送通知。
这是我的代码:
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
exports.sendNewGameNotification= functions.database.ref('/GAMES/{gameId}/PLAYER 2').onWrite(event => {
const player2uid = event.params.val;
const getDeviceTokensPromise = admin.database().ref(`/USERS/${player2uid}/fcm`).once('value');
return Promise.all([getDeviceTokensPromise]).then(results => {
const tokensSnapshot = results[0];
// Notification details.
const payload = {
'data': {
'title': "Tienes una nueva partida"
}
};
// Listing all tokens, error here below.
const tokens = Object.keys(tokensSnapshot.val());
// Send notifications to all tokens.
return admin.messaging().sendToDevice(tokens, payload).then(response => {
// For each message check if there was an error.
const tokensToRemove = [];
response.results.forEach((result, index) => {
const error = result.error;
if (error) {
console.error('Failure sending notification to', tokens[index], error);
// Cleanup the tokens who are not registered anymore.
if (error.code === 'messaging/invalid-registration-token' ||
error.code === 'messaging/registration-token-not-registered') {
tokensToRemove.push(tokensSnapshot.ref.child(tokens[index]).remove());
}
}
});
return Promise.all(tokensToRemove);
});
});
});
执行时,在 firebase 控制台中显示
TypeError: Cannot convert undefined or null to object
如果它是 null 但 fcm 在那里,我做错了什么?
我认为不是这样:
const player2uid = event.params.val;
你想要这个:
const player2uid = event.data.val();
编辑:
此次代码更新包含一些新增检查和简化。这对我有用。
存储令牌(或多个令牌)的数据库结构很关键。令牌是键,而不是值。这些值并不重要,可以是简单的占位符,例如布尔值。
例如:
"USERS" : {
"Roberto" : {
"fcm" : {
"eBUDkvnsvtA:APA...rKe4T8n" : true
}
},
"Juan" : {
"fcm" : {
"fTY4wvnsvtA:APA91bGZMtLY6R...09yTLHdP-OqaxMA" : true
}
}
}
.
exports.sendNewGameNotification= functions.database.ref('/GAMES/{gameId}/PLAYER 2').onWrite(event => {
const player2uid = event.data.val();
return admin.database().ref(`/USERS/${player2uid}`).once('value').then(snapshot => {
if (!snapshot.exists()) {
console.log('Player not found:', player2uid);
return;
}
const tokensSnapshot = snapshot.child('fcm');
if (!tokensSnapshot.exists()) {
console.log('No tokens for player: ', player2uid);
return;
}
// Notification details.
const payload = {
'data': {
'title': "Tienes una nueva partida"
}
};
// Listing all tokens, error here below.
const tokens = Object.keys(tokensSnapshot.val());
// Send notifications to all tokens.
return admin.messaging().sendToDevice(tokens, payload).then(response => {
// For each message check if there was an error.
const tokensToRemove = [];
response.results.forEach((result, index) => {
const error = result.error;
if (error) {
console.error('Failure sending notification to', tokens[index], error);
// Cleanup the tokens who are not registered anymore.
if (error.code === 'messaging/invalid-registration-token' ||
error.code === 'messaging/registration-token-not-registered') {
tokensToRemove.push(tokensSnapshot.ref.child(tokens[index]).remove());
}
}
});
return Promise.all(tokensToRemove);
});
});
});
我正在尝试在添加新游戏时向 "PLAYER 2" 发送通知。 这是我的代码:
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
exports.sendNewGameNotification= functions.database.ref('/GAMES/{gameId}/PLAYER 2').onWrite(event => {
const player2uid = event.params.val;
const getDeviceTokensPromise = admin.database().ref(`/USERS/${player2uid}/fcm`).once('value');
return Promise.all([getDeviceTokensPromise]).then(results => {
const tokensSnapshot = results[0];
// Notification details.
const payload = {
'data': {
'title': "Tienes una nueva partida"
}
};
// Listing all tokens, error here below.
const tokens = Object.keys(tokensSnapshot.val());
// Send notifications to all tokens.
return admin.messaging().sendToDevice(tokens, payload).then(response => {
// For each message check if there was an error.
const tokensToRemove = [];
response.results.forEach((result, index) => {
const error = result.error;
if (error) {
console.error('Failure sending notification to', tokens[index], error);
// Cleanup the tokens who are not registered anymore.
if (error.code === 'messaging/invalid-registration-token' ||
error.code === 'messaging/registration-token-not-registered') {
tokensToRemove.push(tokensSnapshot.ref.child(tokens[index]).remove());
}
}
});
return Promise.all(tokensToRemove);
});
});
});
执行时,在 firebase 控制台中显示
TypeError: Cannot convert undefined or null to object
如果它是 null 但 fcm 在那里,我做错了什么?
我认为不是这样:
const player2uid = event.params.val;
你想要这个:
const player2uid = event.data.val();
编辑:
此次代码更新包含一些新增检查和简化。这对我有用。
存储令牌(或多个令牌)的数据库结构很关键。令牌是键,而不是值。这些值并不重要,可以是简单的占位符,例如布尔值。
例如:
"USERS" : {
"Roberto" : {
"fcm" : {
"eBUDkvnsvtA:APA...rKe4T8n" : true
}
},
"Juan" : {
"fcm" : {
"fTY4wvnsvtA:APA91bGZMtLY6R...09yTLHdP-OqaxMA" : true
}
}
}
.
exports.sendNewGameNotification= functions.database.ref('/GAMES/{gameId}/PLAYER 2').onWrite(event => {
const player2uid = event.data.val();
return admin.database().ref(`/USERS/${player2uid}`).once('value').then(snapshot => {
if (!snapshot.exists()) {
console.log('Player not found:', player2uid);
return;
}
const tokensSnapshot = snapshot.child('fcm');
if (!tokensSnapshot.exists()) {
console.log('No tokens for player: ', player2uid);
return;
}
// Notification details.
const payload = {
'data': {
'title': "Tienes una nueva partida"
}
};
// Listing all tokens, error here below.
const tokens = Object.keys(tokensSnapshot.val());
// Send notifications to all tokens.
return admin.messaging().sendToDevice(tokens, payload).then(response => {
// For each message check if there was an error.
const tokensToRemove = [];
response.results.forEach((result, index) => {
const error = result.error;
if (error) {
console.error('Failure sending notification to', tokens[index], error);
// Cleanup the tokens who are not registered anymore.
if (error.code === 'messaging/invalid-registration-token' ||
error.code === 'messaging/registration-token-not-registered') {
tokensToRemove.push(tokensSnapshot.ref.child(tokens[index]).remove());
}
}
});
return Promise.all(tokensToRemove);
});
});
});