Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我如何通过使用Firebase云功能请求通知的其他用户插入的电子邮件发送通知?_Javascript_Firebase_Firebase Realtime Database_Firebase Cloud Messaging_Google Cloud Functions - Fatal编程技术网

Javascript 我如何通过使用Firebase云功能请求通知的其他用户插入的电子邮件发送通知?

Javascript 我如何通过使用Firebase云功能请求通知的其他用户插入的电子邮件发送通知?,javascript,firebase,firebase-realtime-database,firebase-cloud-messaging,google-cloud-functions,Javascript,Firebase,Firebase Realtime Database,Firebase Cloud Messaging,Google Cloud Functions,我是Firebase云功能的初学者,我正在开发一个web应用程序,使用它向特定用户发送通知。然而,问题是,我想让用户决定他想向谁发送消息,而我发现这样做的方式是允许用户通过我网站的表单插入收件人的电子邮件,这样我就可以把它保存在我的数据库中,然后激活一个功能,将先前创建的通知发送给已注册的用户,该用户与发件人用户插入的电子邮件相同 因此,我知道每当用户发送带有接收者电子邮件的表单时,我都必须触发该函数,因为这是我的数据库更改的时候。但是,我不知道如何将插入的电子邮件与所有其他用户的电子邮件进行比

我是Firebase云功能的初学者,我正在开发一个web应用程序,使用它向特定用户发送通知。然而,问题是,我想让用户决定他想向谁发送消息,而我发现这样做的方式是允许用户通过我网站的表单插入收件人的电子邮件,这样我就可以把它保存在我的数据库中,然后激活一个功能,将先前创建的通知发送给已注册的用户,该用户与发件人用户插入的电子邮件相同

因此,我知道每当用户发送带有接收者电子邮件的表单时,我都必须触发该函数,因为这是我的数据库更改的时候。但是,我不知道如何将插入的电子邮件与所有其他用户的电子邮件进行比较,然后只捕获正确用户的令牌来发送通知。有人知道怎么做吗

以下是我的代码,我将其中的一些部分作为基础,以及来自我的部分数据库的JSON:

功能

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

const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
exports.sendPush = 
functions.database.ref('/Messages/Receivers/{pushId}').onWrite(event => {

const snapshot = event.data;

const email = snapshot.val().email;
const getAllUsersPromise = admin.database().ref('Users/').once('value');

const payload = {

    notification: {
        title: 'You have a notification',
        body: 'You received a new message'
    }

};

return getAllUsersPromise.then(result => {
    const userUidSnapShot = result;

    const users = Object.keys(userUidSnapShot.val());

    var AllUsersFCMPromises = []; 
    for (var i = 0;i<userUidSnapShot.numChildren(); i++) {
        const user=users[i];
        console.log('getting promise of user uid=',user);
        AllUsersFCMPromises[i]= admin.database().ref(`/Users/${user}/email`).equalTo(email).once('value').then(token => {
            var token = admin.database().ref(`/Users/${user}/token`).once('value');
            return token; 
        });
    }

    return Promise.all(AllUsersFCMPromises).then(results => {

        var tokens = []; 
        for(var i in results){
            var usersTokenSnapShot=results[i];
            console.log('For user = ',i);
            if(usersTokenSnapShot.exists()){
                if (usersTokenSnapShot.hasChildren()) { 
                    const t=  Object.keys(usersTokenSnapShot.val()); 
                    tokens = tokens.concat(t); 
                    console.log('token[s] of user = ',t);
                }
                else{

                }
            }
        }
        console.log('final tokens = ',tokens," notification= ",payload);
        return admin.messaging().sendToDevice(tokens, payload).then(response => {

            const tokensToRemove = [];
            response.results.forEach((result, index) => {
                const error = result.error;
                if (error) {
                    console.error('Failure sending notification to uid=', tokens[index], error);

                    if (error.code === 'messaging/invalid-registration-token' || error.code === 'messaging/registration-token-not-registered') {
                        tokensToRemove.push(usersTokenSnapShot.ref.child(tokens[index]).remove());
                    }
                }
                else{
                    console.log("notification sent",result);
                }
            });
        });
    }); 
});
});

我希望从那时起,我能够让自己被理解并感谢

当您只需要查询拥有所选电子邮件的一个或多个用户时,您似乎正在查询所有用户。不要使用
getAllUsersPromise
,而是使用
.orderByChild()
并查询其电子邮件与所选电子邮件相等的子级

let selectedUsers = admin.database.ref('Users/').orderByChild('email').equalTo(email).once(snap => {
    // Get the token
})

这将为您提供仅拥有该电子邮件的一个或多个用户的快照。然后,您可以遍历快照并获取令牌

首先谢谢你的回答,但是我试着照你说的做了,但是我仍然很难抓住令牌。为此,我尝试以下方法:
var-token=snap.val().token
,但当我试图在控制台中查看它的值时,它显示为
未定义
。那么,你能告诉我正确的方法吗?
let selectedUsers = admin.database.ref('Users/').orderByChild('email').equalTo(email).once(snap => {
    // Get the token
})