我正在尝试为唯一的用户名和额外的个人资料数据(如头像等)创建单独的数据存储区。我有以下架构:
mydatabase : {
users: [{
<actual user's id>: {
username: "helloworld"
},
<actual user's id>: {
username: "2test"
}]
}
我的方法是否正确?我没有在firebase中看到在firebase的身份验证记录中存储用户名或额外用户数据的方法。此外,我注意到我在网上找到的大多数示例为每行数据生成一个按键,但在这里我使用的是实际用户的id而不是push键。我想在用户尝试创建用户名以查看是否已经使用时最终查询此信息。
答案 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');
}
})
}