Javascript 如何使用Typescript查询Firebase?

Javascript 如何使用Typescript查询Firebase?,javascript,typescript,google-cloud-functions,Javascript,Typescript,Google Cloud Functions,我已使用Firebase云功能为我的应用程序设置推送通知。它工作得很好。现在我想更新应用程序的徽章计数,作为推送通知的一部分。我读过这样做的唯一方法是通过服务器端代码;我不能在本地做 因此,我试图从服务器获取新用户的数量,然后在发送推送通知时使用该数量作为徽章计数,但我不知道如何进行。我花了三天的时间在这上面,现在我希望有人能给我指出正确的方向 我正在使用Firebase函数和Typescript(带VSCode)。我的行动方针是: 从“admin”节点获取用户ID列表 在“user”节点上迭代

我已使用Firebase云功能为我的应用程序设置推送通知。它工作得很好。现在我想更新应用程序的徽章计数,作为推送通知的一部分。我读过这样做的唯一方法是通过服务器端代码;我不能在本地做

因此,我试图从服务器获取新用户的数量,然后在发送推送通知时使用该数量作为徽章计数,但我不知道如何进行。我花了三天的时间在这上面,现在我希望有人能给我指出正确的方向

我正在使用Firebase函数和Typescript(带VSCode)。我的行动方针是:

  • 从“admin”节点获取用户ID列表
  • 在“user”节点上迭代这些userid,以查询用户的“newUser”参数是否为true
  • 将这些结果附加到数组中
  • 对阵列进行计数,然后在推送通知时将其发送给徽章
  • 我的“用户”数据库结构如下:

    "users": {
    
      "2NBvNgdNRVe3nccTEDts2Xseboma": {
    
        "email": "someone@someone.com"
    
        "newUser": "true",
    
        "referral": "none",
    
        ...
    
      },
    
      "hjC6os6wzIV1FyULmGxalU3fM7ef": {
    
        "email": "someoneElse@someone.com"
    
        "newUser": "false",
    
        "referral": "Bennett",
    
        ...
    
      }
    
    我的“管理员”数据库的结构如下:

    "admin": {
    
      "2NBvNgdNRVe3nccTEDts2Xseboma": {
    
        "email": "someone@someone.com"
    
        "familyName": "Someone",
    
        "memberSince": "1529119893",
    
      },
    
      "hjC6os6wzIV1FyULmGxalU3fM7ef": {
    
        "email": "someoneElse@someone.com"
    
        "familyName": "Someone Else",
    
        "memberSince": "1529125722",
    
        ...
    
      }
    
    以下是我编写代码的微弱尝试:

    exports.getNewUserCount =
    
    functions.database.ref('/users/{userID}/newUser')
    
        .onUpdate((snapshot, _context) => {
    
            console.log('test 2')
    
            // Get a database reference
    
            const db = admin.database();
            const ref = db.ref('admin');
    
    
            return ref.once('value', function(adminSnap) {
    
                const userData = adminSnap.val()
    
                console.log('admin key:', adminSnap.key)
                console.log('user data:', userData)
    
            })
    
        });
    
    现在,我一直在从admin节点检索用户列表(我上面的步骤#1)

    更新

    我最终得到了一个用户列表作为快照,但我不知道如何迭代它们。如何将快照转换为用户密钥数组

    一旦我得到了用户密钥列表,那么我如何使用它来迭代“users”节点以获得新用户列表(我上面的步骤#2)

    然后,如何将这些新用户放入一个数组(上面的步骤#3),然后在发送推送通知(上面的步骤#4)时获取“badge”参数的新用户数

    问题是,这似乎真的很低效。必须有更好的方法来获取新用户列表。我必须能够执行某种查询,通过我的“用户”节点,查看哪些节点的“新用户”节点为“真”,并计算出它们的数量——而不是我从“管理”节点获取用户列表的迂回方式,然后使用该列表从“用户”节点获取“新用户”列表,然后创建一个数组,然后计算该数组,然后使用该数字发送到推送通知中的“badge”参数

    有什么想法吗?我已经干了好几天了

    如果有帮助的话,我知道Swift,它的应用程序是iOS。谢谢

    更新#2

    因此,我选择尝试获取所有用户的快照,并完全绕过“admin”节点。代码如下:

    const db = admin.database();
    const ref = db.ref('users');
    
    return ref.once('value').then((adminSnap) => {
    
        console.log('admin key:', adminSnap.key)
    
        // create blank array to store 
        let newUserCount = 0;
    
        // iterate over adminSnap to get each individual snap
        adminSnap.forEach(function (userSnap) {
    
            const userData = userSnap.val();
            const userKey = userSnap.key
    
            // console.log('email?', userData.email, 'user key:', userKey, 'new user?', userData.newUser)
    
            if (userData.newUser === true) {
                newUserCount++
                console.log('new user:', userKey, userData.newUser, userData.email)
            }
        });
    
        console.log(newUserCount)
    })
    
    这段新代码可以工作,并在我执行推送通知时为我的徽章参数提供编号,但我想知道这是否是最有效的方法。另外,随着我的数据库规模的增长,它会不会加重服务器的负担/降低速度?对于我的Firebase帐户,它不会花费我很多带宽吗


    我原以为这是一件简单的事情,但现在变得有点麻烦了。我愿意用不同的方式来完成这件事。谢谢

    经过更多的研究,我最终放弃了原来的方法。我决定在Firebase数据库上创建一个具有新用户数的新节点,然后通过其他地方的代码进行更新。这是最简单的方法,将使用最少的带宽

    这是我的最终代码:

    function sendAlertToiPhone() {
    
    console.log('test E')
    
    // Get a database reference
    const db = admin.database();
    const ref = db.ref('stats');
    
    ref.child('newUserCount').once('value').then((snapshot) => {
    
        const newUserCount = snapshot.val()
    
        console.log('new user count:', newUserCount)
    
        // send to Phontaine's iPhone 6
        const FCMToken = "blahbehtyblahblah"
    
        const payload = {
            notification: {
                title: 'New User',
                body: 'Moneypants has a new download.',
                sound: 'default',
                badge: String(newUserCount)
            }
        };
    
        return admin.messaging().sendToDevice(FCMToken, payload)
            .then(function (response) {
                console.log("Successfully sent message:", response);
            })
            .catch(function (error) {
                console.log("Error sending message:", error);
            });
    
    }).catch(function (err) {
        console.log('new user count error:', err);
    })
    }