首页 > 解决方案 > 颤振通知/解析错误:意外的令牌管理员

问题描述

我想在他订阅的其他用户上传新项目时向用户发送消息。

我的解决方法:

首先,我检查是否上传了新项目。如果这是真的,我想从上传项目的用户那里获取 uid。然后我转到用户的文件(用户/{上传项目的用户的 uid}),其中订阅他的帐户位于带有其 uid 的字符串列表中。对于此列表中的每个 uid,我想从具有此特定 uid(User/{uid from List}/devicetoken)的用户那里获取 devicetoken,并将每个 devicetoken 添加到字符串列表中。有了这个 devicetoken,我终于想向这个列表中的每个设备发送一条消息。但我对 js 和后端开发的经验并不丰富。

我的代码遵循所描述的方式,但是当我尝试将其部署到 firebase 功能时,我得到了一些警告。

部署到 Firebase 时的警告:

24:17 警告避免嵌套承诺承诺/不嵌套

24:17 警告避免嵌套承诺承诺/不嵌套

30:26 警告不要在循环内创建函数 no-loop-func

46:20 警告避免嵌套承诺承诺/不嵌套

46:20 警告避免嵌套承诺承诺/不嵌套

你们有人可以帮我解决我的问题吗:)?

const functions = require('firebase-functions');
const admin = require('firebase-admin');

admin.initalizeApp(functions.config().firebase);

var msgData;

//listen for new uploades
exports.recipeTrigger = functions.firestore.document('item/{itemId}').onCreate(async(snapshot) => {
msgData = snapshot.data();

//get dat from the user that uploaded the item
await admin.firestore().collection('User/' + msgData.uid).get().then((snapshots) => {
    var users = [];
    var tokens = [];
    if (snapshot.empty) {
        console.log('No Users');
        return null;
    } else {
        //get every user uid
        users = snapshots.data().subscribers;
        for (user of users) {
            //user should be the uid
            admin.firestore().collection('User/' + user).get().then((snap) => {
                for (var token of snap.docs) {
                    //add devicetoken to a list Avoid nesting promises
                    tokens.add(token.data().token);
                }
                return tokens;
            }).catch(error => { print(error) })
            return users;
        }
        //specify message content
        var payload = {
                "notification": {
                    "title": "From" + snapshots.data().displayName,
                    "body": "I uploaded a new Recipe",
                    "sound": "default",
                },
                "data": {
                    "senderName": snapshots.data().displayName,
                    "message": snapshots.data().displayName + "uploaded a new Recipe",
                }
            }
            //send message to devicetokens
        return admin.messaging().sendToDevice(tokens, payload).then((response) => {
            console.log('Notifications send');
            return response;
        }).catch((er) => {
            console.log(er);
        });
    }
}).catch(error => { print(error) });
})

标签: javascriptfirebasegoogle-cloud-functions

解决方案


firestore错误消息告诉您使用令牌查看第 23 行:

await firestore().document('User/' + user).get().then((snap) => {

你可能是想说admin.firestore().doc(...)


推荐阅读