在Firebase中维护唯一用户名和额外配置文件数据的正确方法

时间:2017-07-05 17:33:31

标签: firebase firebase-realtime-database firebase-authentication

我正在尝试为唯一的用户名和额外的个人资料数据(如头像等)创建单独的数据存储区。我有以下架构:

mydatabase : {
   users: [{
     <actual user's id>: {
        username: "helloworld"
     },
     <actual user's id>: {
        username: "2test"
     }]
}

我的方法是否正确?我没有在firebase中看到在firebase的身份验证记录中存储用户名或额外用户数据的方法。此外,我注意到我在网上找到的大多数示例为每行数据生成一个按键,但在这里我使用的是实际用户的id而不是push键。我想在用户尝试创建用户名以查看是否已经使用时最终查询此信息。

1 个答案:

答案 0 :(得分:3)

我会使用您正在使用的相同方法。我同意使用userId作为键而不是pushId是有意义的,因为正如您所指出的,您以后想要查询数据。

使用此结构的唯一潜在挑战是,如果您希望用户在创建用户时选择用户名,他们将无法读取数据库,因此他们无法检查是否存在用户名是唯一的。只要您首先创建用户然后让他们在经过身份验证后选择用户名即可,这不会成为问题。如果您希望首先选择用户名,则可以使用Cloud Functions for Firebase和HTTP触发器,并将用户名作为请求的一部分传递。该请求将包括对给定用户名的查询,并且响应将返回用户名是否可用。它可能看起来像这样:

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);

exports.uniqueUsername = functions.https.onRequest((req, res) => {
    const username = req.query.username
    admin.database().ref('users').orderByChild('username').equalTo(username)once('value').then(snap => {
        // if the child exists, then the username is taken
        if (snap.exists()) {
            res.send('username not available');
        } else {
            res.send('username available');
        }
    })   
}