虽然使用Firebase读取时间数据库进行建模,但始终无法确定唯一密钥。
我的用户集合被标识为电子邮件ID。
所以我的目标是为数据库建模,如下所示。
{
"users": {
"aa@dd.com": {
"name": "aa",
"addr": "new york",
"tel": "3224323"
},
"bb@dd.com": {
"name": "bb",
"addr": "new york",
"tel": "3224323"
},
"cc@dd.com": {
"name": "bb",
"addr": "new york",
"tel": "3224323"
},
"dd@dd.com": {
"name": "cc",
"addr": "new york",
"tel": "3224323"
}
}
}
但是Firebase不允许使用某些特殊字符作为键。例如@
,:
等
如何修复模型以适应Firebase?
答案 0 :(得分:1)
您可以从将电子邮件作为唯一密钥更改为具有从Firebase身份验证中获得的唯一ID。
如果您使用UID
,则可以在身份验证中将Firebase数据库彼此连接,因为它是由Firebase身份验证提供的。而且,这样做更好,因为如果用户更改了他的电子邮件,那么您需要更改数据库以适应用户的更改。
检查以下内容:
https://firebase.google.com/docs/auth/web/manage-users#get_a_users_profile
答案 1 :(得分:1)
实际上,firebase不允许仅使用“。”,“#”,“ $”,“ [”或“]”字符...:
// in app.get("/popularify", async function (req, res))
spotifyApi.authorizationCodeGrant(code).then(
function(data) {
spotifyApi.setAccessToken(data.body['access_token']);
spotifyApi.setRefreshToken(data.body['refresh_token']);
spotifyApi.getArtistAlbums('43ZHCT0cAZBISjO8DG9PnE').then(
function(data) {
res.send(data.body);
},
function(err) {
res.send(err);
}
);
}).catch((err) {
console.log('Something went wrong!', err);
})
);
...因此,这种情况下的问题只是'。'。字符。
因此,在您的用例中,可以更改“。”使用其他方法,您可以执行以下规则:
Uncaught (in promise) Error: Reference.child failed:
First argument was an invalid path = "firebase/xxx@gmail.com/data".
Paths must be non-empty strings and can't contain ".", "#", "$", "[", or "]"
(由https://firebase.google.com/docs/reference/security/database#replacesubstring_replacement启发)
从现在开始,只需保存如下数据:
{
"rules": {
"users": {
"$email": {
".read": true,
".write": "$email === auth.token.email.replace('.', ',')",
}
}
}
}
因此最终数据将如下所示:
const email = firebase.auth().currentUser.email.replace(/\./g, ',');
// test@gmail,com
await firebase.database()
.ref(`users/${email}/data`)
.set({
name: "eee",
addr: '56 Barker Close',
tel: '1234567890'
});