【问题标题】:Unable to add data to custom User collection properly in Firestore无法在 Firestore 中正确地将数据添加到自定义用户集合
【发布时间】:2021-02-16 21:23:56
【问题描述】:

问题

我想将几个用户数据添加到 Firestore Authenticateced 用户列表和我自己创建的 users 集合中,但它并不顺利。 users 集合仅更新它的一部分。

数据

// javascript
users: [
  {email: "n_0@example.com", username: "user0"},
  {email: "n_1@example.com", username: "user1"},
  {email: "n_2@example.com", username: "user2"},
  {email: "n_3@example.com", username: "user3"},
  {email: "n_4@example.com", username: "user4"}
]

代码

// javascript

import * as app from 'firebase/app'
import 'firebase/auth'

const config = JSON.parse(process.env.VUE_APP_FIREBASE_CONFIG)

app.initializeApp(config)

export const firebase = app
export const auth = app.auth()

function asyncCreateUser(user) {
  return auth.createUserWithEmailAndPassword(
    user.email,
    'password'
  ).then(function (createdUser) {
    console.log('---')
    console.log('user.email', user.email)
    console.log('createdUser', createdUser.user.email)
    const ref = usersRef.doc(createdUser.user.uid)
    return ref.set(user)
  })
}
this.users.map(user => asyncCreateUser(user))

结果

  • 经过身份验证的用户没问题。
  • users 集合有问题:集合中只有三个用户。在不同的执行过程中,添加到user 集合的用户数量可能会有所不同。

日志

Debug.vue?2083:50 user.email n_3@example.com
Debug.vue?2083:51 createdUser n_2@example.com
Debug.vue?2083:49 ---
Debug.vue?2083:50 user.email n_2@example.com
Debug.vue?2083:51 createdUser n_1@example.com
Debug.vue?2083:49 ---
Debug.vue?2083:50 user.email n_1@example.com
Debug.vue?2083:51 createdUser n_1@example.com
Debug.vue?2083:49 ---
Debug.vue?2083:50 user.email n_0@example.com
Debug.vue?2083:51 createdUser n_0@example.com
Debug.vue?2083:49 ---
Debug.vue?2083:50 user.email n_4@example.com
Debug.vue?2083:51 createdUser n_4@example.com

奇怪的是,在某些部分,user.emailcreatedUser 是不同的。

需要帮助

我想知道如何解决它。如果可能的话,我也想知道原因。谢谢!

【问题讨论】:

    标签: javascript reactjs firebase vue.js google-cloud-firestore


    【解决方案1】:

    只是猜测 - 您正在使用 javascript SDK 创建用户,而不是管理 SDK。

    Javascript SDK 在创建帐户后登录用户,因此基本上您连续 5 次快速登录和退出新帐户,因此在创建 firestore 文档时与用户 ID 混淆 - 可能是您当时刚刚退出:

    如果创建了新帐户,则用户会自动登录。 查看下面的后续步骤部分以获取登录用户 详情。

    Firebase docs

    如果您想批量创建用户帐户,您最好在安全的环境中使用管理 SDK(例如 cloud functions)并简单地从您的前端触发 https 功能。您现在这样做的方式意味着所有帐户都将按顺序创建,这在您一次创建批次时可能会非常耗时 - 如果您使用云功能和 admin sdk,您可以开始创建所有帐户并行并在所有完成后返回一个承诺 - 类似于:

    return Promise.all(users.map(user => admin.auth().createUser(user)
      .then(function(userRecord) {
         return admin.firestore().collection('users').doc(userRecord.uid).set(...);
      })
    })
    

    Firebase admin reference

    【讨论】:

      【解决方案2】:

      我自己解决了。似乎async 在地图中的调用出错了。

      self = this
      for (let i = 0; i < 5; i++) {
        const self = this
        await auth.createUserWithEmailAndPassword(data[i].email, 'password')
          .then(function (res) {
            const ref = usersRef.doc(res.user.uid)
            self.data[i]._id = res.user.uid
            ref.set(self.data[i])
            }
          )
      }
      

      【讨论】:

        猜你喜欢
        • 2021-11-30
        • 2022-06-11
        • 2018-07-06
        • 2015-06-15
        • 2021-12-21
        • 2018-03-16
        • 1970-01-01
        • 1970-01-01
        • 2020-09-12
        相关资源
        最近更新 更多