如何使用 Firebase 为新用户创建自定义 URL?

How to create custom URLs for new users using Firebase?

我有一个 React/Redux 应用程序,它在 Firebase 下创建新用户并将其保存为 /users/<uid>

但是,我还想让每个用户的个人资料页面都有一个自定义 URL,例如 domain.com/users/john-daviddomain.com/users/john-david-1343(如果原来的 /users/john-david 已经拍摄。)

最好的方法是什么?

我的问题是我打算在 Firebase 中将用户存储在 /users/<firstname-lastname-hash> 下,但是将它们存储在除 uid 之外的任何东西下似乎不是一个好主意(这是真的吗?)。

而且,如果我不这样做,那么我如何在 Firebase 中维护 /users/<uid>,同时创建新的用户名以解决重复问题,并在访问时搜索用户是否存在 domain.com/users/john-david-123

这是新用户保存到 Firebase 的一些示例代码

export function saveUser (data, user) {
  let username = data.username
  return ref.child(`users/${user.uid}/info`)
    .set({
      email: user.email,
      firstname: data.firstName,
      lastname: data.lastName,
      admin: false,
      // for /users/<username>
      username: username,
      uid: user.uid
    })
    .then(() => user)
}

一般来说,我们说您应该按照您打算如何查看数据的方式将数据存储在 Firebase 中,没有理由特别要求您在存储时必须使用 UID 作为主键用户。您可能想要的是:

  1. 如您所述,将用户数据存储在 /users/${username} 中,包括一个 uid 字段。
  2. 当用户注册时,生成 firstname-lastname slug 并存储在 /uids/${uid} = username.

这样你就有了一个简单的方法来从 UID 映射到用户,反之亦然。这里的缺点是,一旦您将用户名写入数据结构,您可能永远不应该让他们更改用户名。

或者,您可以撤销我的建议并存储 /usernames/${username} = uid/users/${uid}。这使得重命名用户名变得更容易,但需要您进行额外的查找才能从用户名转到数据。