FireBase总用户数

yqhsw0fo  于 2022-10-24  发布在  Angular
关注(0)|答案(5)|浏览(521)

有没有办法在Firebase中获得所有用户的数量?(通过密码、Facebook、Twitter等进行身份验证)所有经过社交、电子邮件和密码身份验证的用户总数。

iecba09b

iecba09b1#

没有内置的方法来获取总用户数。
您可以保留用户ID的索引,然后向下拉取并对其进行计数。然而,这将需要下载所有数据才能获得计数。

{
  "userIds": {
    "user_one": true,
    "user_two": true,
    "user_three": true 
  }
}

然后在下载数据时,可以调用snapshot.numChildren()

var ref = new Firebase('<my-firebase-app>/userIds');
ref.once('value', function(snap) {
  console.log(snap.numChildren());
});

如果您不想下载数据,可以使用事务来维护总计数。

var ref = new Firebase('<my-firebase-app>');
ref.createUser({ email: '', password: '', function() {
  var userCountRef = ref.child('userCount');
  userCountRef.transaction(function (current_value) {
    // increment the user count by one
    return (current_value || 0) + 1;
  });
});

然后,您可以实时监听用户:

var ref = new Firebase('<my-firebase-app>/userCount');
ref.on('value', function(snap) {
  console.log(snap.val());
});
s1ag04yj

s1ag04yj2#

使用Cloud Functions

exports.updateUserCount = functions.auth.user().onCreate(user => {
  return admin.database().ref('userCount').transaction(userCount => (userCount || 0) + 1);
});

只需注意,云函数事件是在使用自定义令牌创建用户时触发的。在这种情况下,您需要执行以下操作:

exports.updateUserCount = functions.database.ref('users/{userId}').onCreate(() => {
  return admin.database().ref('userCount').transaction(userCount => (userCount || 0) + 1);
});
yruzcnhs

yruzcnhs3#

更新2021

我偶然发现了这个问题,并想分享三种方法来获得注册用户总数。

👀查看控制台

进入console,在身份验证选项卡下,可以直接读取用户列表下的用户数:

56个用户!耶!

使用管理员SDK进行📜

对于对用户数量的编程访问,可能会根据提供商类型、注册日期、上次连接日期进行筛选...您可以编写一个脚本,利用admin SDK中的listUser。
例如,要计算自3月16日以来注册的用户:

const admin = require("firebase-admin");
const serviceAccount = require("./path/to/serviceAccountKey.json");
admin.initializeApp({ credential: admin.credential.cert(serviceAccount) });

async function countUsers(count, nextPageToken) {
    const listUsersResult = await admin.auth().listUsers(1000, nextPageToken);

    listUsersResult.users.map(user => {
        if (new Date(user.metadata.creationTime) > new Date("2021-03-16T00:00:00")) {
            count++;
        }
    });

    if (listUsersResult.pageToken) {
        count = await countUsers(count, listUsersResult.pageToken);
    }

    return count;
}

countUsers(0).then(count => console.log("total: ", count));

💾将用户存储在数据库中

你的应用程序可能已经将用户文档存储在FiRestore、实时数据库或任何其他数据库中。您可以对这些记录进行计数,以获得注册用户总数。(如果你使用FiRestore,你可以阅读my article关于如何计算文档的内容)

vcudknz3

vcudknz34#

现在是2022年年中,据我所知,所需的功能仍然不是Node.js管理SDK,但可以从Identity工具包REST API获得。
Louis Coulet建议我查看Firebase控制台,这让我感到惊讶。查看控制台的API调用,我们可以看到有一个“查询”端点可以返回帐户数。
此处记录了端点:https://cloud.google.com/identity-platform/docs/reference/rest/v1/projects.accounts/query
管理员SDK可以提供调用端点所需的访问令牌。请参阅https://firebase.google.com/docs/reference/admin/node/firebase-admin.app.credential.md#credentialgetaccesstoken

firebase.initializeApp();
firebase.app().options.credential.getAccessToken().then(the_token => ...)

与控制台一样,我们提供了一个空查询表达式,并将returnUserInfo标志设置为FALSE

curl --request POST \
  --url 'https://identitytoolkit.googleapis.com/v1/projects/your_project_goes_here/accounts:query?alt=json' \
  --header 'Content-Type: application/json' \
  --header 'authorization: Bearer the_token' \
  --data '{
    "returnUserInfo": false,
    "expression": []
}'

查询结果为帐户数

{
  "recordsCount": "1223"
}
ljsrvy3e

ljsrvy3e5#

以下是一个用于此目的的Java脚本模块-https://gist.github.com/ajaxray/17d6ec5107d2f816cc8a284ce4d7242e
在单行中,它所做的是-
在Firebase Web应用程序中保留在线用户列表(和计数)-按独立房间或全球
统计使用此模块的所有用户-

firebase.initializeApp({...});
var onlineUsers = new Gathering(firebase.database());
gathering.join();

// Attach a callback function to track updates
// That function will be called (with the user count and array of users) every time user list updated
gathering.onUpdated(function(count, users) {
    // Do whatever you want
});

相关问题