Firebase:使用电子邮件ID作为密钥

时间:2019-04-02 04:53:38

标签: firebase firebase-realtime-database database-design

虽然使用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?

2 个答案:

答案 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'
    });