我正在尝试在注册后向我的应用发送注册通知,并且用户已保存在db中。我正在使用firebase云功能。
我从firebaseinstanceidservice获取了设备令牌并使用路径users/userid/deviceToken
将其保存在用户的数据库中,并在函数中引用了此路径,如下所示:
exports.sendNotification = functions.database.ref("users/{userId}/{instanceId_token}")
我已经尝试记录devicetoken以确保但是在云控制台中,我不断获取该日志的其他属性,如:sendNotification
deviceToken name
,sendNotification
deviceToken userId
而不是db中保存的字母数字值。这条路是错的吗?
这是我的完整代码:
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
exports.sendNotification =
functions.database.ref("users/{userId}/{instanceId_token}")
.onWrite((changes, context) => {
const userId = context.params.userId;
console.log("user-id", userId);
const notificationToken = context.params.instanceId_token;
console.log("deviceToken", notificationToken);
var payload = {
data: {
title: "Welcome to My Group",
message: "You may have new messages"
}
};
return admin.messaging().sendToDevice(notificationToken, payload)
.then(function (response) {
return console.log("Successfully sent message: ", response);
})
.catch(function (error) {
return console.log("Error sending message: ", error);
})
});
此外,该函数在admin.messaging
回调后显示此温和的消息:
Successfully sent message: { results: [ { error: [Object] } ],
canonicalRegistrationTokenCount: 0,
failureCount: 1,
successCount: 0,
multicastId: 8880906162831350000 }
我如何解决这个问题,我使用的是Android客户端?
答案 0 :(得分:1)
您应该在上层节点上触发您的功能,如下所示。并访问instanceId_token
到changes.after.val()
。
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
exports.sendNotification =
functions.database.ref("users/{userId}")
.onWrite((changes, context) => {
const userId = context.params.userId;
console.log("user-id", userId);
const notificationToken = changes.after.val().instanceId_token;
console.log("deviceToken", notificationToken);
var payload = {
data: {
title: "Welcome to My Group",
message: "You may have new messages"
}
};
return admin.messaging().sendToDevice(notificationToken, payload)
.catch(function (error) {
console.log("Error sending message: ", error);
})
});
如果您仅在创建用户后添加instanceId_token
,则应使用onUpdate()
触发(“数据更新时触发”,而onWrite()
触发数据时触发创建,更新或删除“)。
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
exports.sendNotification =
functions.database.ref("users/{userId}")
.onUpdate((changes, context) => {
const userId = context.params.userId;
console.log("user-id", userId);
const notificationToken = changes.after.val().instanceId_token;
console.log("deviceToken", notificationToken);
if (notificationToken === undefined) {
console.log("notificationToken === undefined");
return false;
} else {
var payload = {
data: {
title: "Welcome to My Group",
message: "You may have new messages"
}
};
return admin.messaging().sendToDevice(notificationToken, payload)
.catch(function (error) {
console.log("Error sending message: ", error);
})
}
});
另请注意,您不应该
return admin.messaging().sendToDevice(notificationToken, payload)
.then(function (response) {
return console.log("Successfully sent message: ", response);
})
.catch(function (error) {
return console.log("Error sending message: ", error);
});
因为在这种情况下你没有返回一个“在函数中完成所有异步工作时解析的”。 (参见question的答案)
所以只需返回sendToDevice返回的promise(参见doc),如下所示:
return admin.messaging().sendToDevice(notificationToken, payload)
.catch(function (error) {
console.log("Error sending message: ", error); // here no return
});