gpt4 book ai didi

javascript - 如何使用 Typescript 查询 Firebase?

转载 作者:搜寻专家 更新时间:2023-10-30 21:56:44 27 4
gpt4 key购买 nike

我使用 Firebase Cloud Functions 为我的应用设置了推送通知。它运作良好。现在我想更新应用程序的徽章计数作为推送通知的一部分。我读过唯一的方法是通过服务器端代码;我在本地做不到。

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

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

  1. 从“admin”节点获取用户 ID 列表
  2. 遍历“用户”节点上的那些用户 ID,以查询用户的“newUser”参数是否为真
  3. 将这些结果附加到一个数组中
  4. 对数组进行计数,然后在推送通知时将其发送到徽章

我的“用户”数据库结构是这样的:

"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)

})

});

现在我一直在从管理节点检索用户列表(我上面的第 1 步)。

更新

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

然后,一旦我获得了用户 key 列表,我该如何使用它来遍历“用户”节点以获取新用户列表(我上面的第 2 步)?

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

问题是这看起来效率很低。必须有更好的方法来简单地获取新用户列表。必须有某种我可以执行的查询,它将遍历我的“用户”节点,查看哪些用户的“新用户”节点为“真”,并计算这些节点的数量——而不是我的迂回获取方式来自“管理”节点的用户列表,然后使用该列表从“用户”节点获取“新用户”列表,然后创建一个数组,然后计算该数组,然后使用该数字发送到“徽章” ' 我的推送通知上的参数。

有什么想法吗?我已经这样做了好几天了。

如果有帮助,我知道 Swift 并且该应用程序是 iOS。谢谢!!

更新#2

所以我选择尝试获取所有用户的快照并完全绕过“管理”节点。这是代码:

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);
})
}

关于javascript - 如何使用 Typescript 查询 Firebase?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53994819/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com