【问题标题】:how to use cloud functions to save user's displayName when creating account in firebase [duplicate]在firebase中创建帐户时如何使用云功能保存用户的displayName [重复]
【发布时间】:2018-01-30 01:28:47
【问题描述】:

问题:创建用户帐户时,如何使用云功能将其 displayName 保存到 firebase 中的实时数据库

场景步骤:

  1. 我有一个包含email, password, displayName 字段的注册页面, 允许用户在 firebase 中创建新帐户

  2. 以上页面将 1) 触发createUserWithEmailAndPassword 创建 用户帐户,2) 将 displayName 值保存到 Auth DB 中的 userProfile。

  3. 在云功能中,使用下面的代码,以便新用户的电子邮件可以 保存到 DB users 节点。

exports.createProfile = functions.auth.user().onCreate(event => return admin.database().ref(`/users/${event.data.uid}`).update ({email: event.data.email})

  1. 我希望使用上面的代码将displayName 保存到users 节点,但这似乎不可能,因为它不在event 的上下文中onCreate

我该怎么办?如果我需要同时使用客户端和云功能来更新users 节点,那就太麻烦了。

最好的问候, D

【问题讨论】:

  • 我刚刚遇到了同样的问题。你解决了吗?

标签: firebase firebase-realtime-database firebase-authentication google-cloud-functions


【解决方案1】:

身份验证事件的documentation 表明可以通过event.data.displayName 访问displayName。如果您看到任何其他行为,那是一个错误,或者您可能做错了您没有在此处提及的事情。

【讨论】:

  • 我的问题是,当使用电子邮件和密码创建帐户时,似乎无法传递“显示”。如果用户使用 Facebook 或谷歌的 Oauth,则“显示名称”是从提供商处检索并可以访问的.
  • 也许您可以尝试在客户端创建后立即设置它,以查看它是否在函数触发之前提交。 stackoverflow.com/questions/39804867/…
  • 谢谢!您的评论类似于下面提出的 Dhruv。我认为我应该为用户创建事件放弃云功能,并从客户端做所有事情。使用云功能的最初原因是,与客户端代码相比,它是 100% 保证运行的。
【解决方案2】:

一旦firebase.auth().createUserWithEmailAndPassword(email, password) 方法完成,您需要使用firebase.User.updateProfile() 方法更新displayName。像这样——

firebase.auth().createUserWithEmailAndPassword(email, password).catch(function (error) {

}).then(function (user) {
        user.updateProfile({
            displayName: "Jane Q. User",//pass displayName from your signup form here
            photoURL: "<image-url>"//you can pass this empty
        }).then(function () {
            //redirect to your post-registration page
        });
})

【讨论】:

  • 我确实尝试过,并认为这是解决方案。但是,引入了竞争条件。 functions.auth.user().onCreateupdateProfile 都异步尝试更新 displayName。为什么云函数会更新 displayName?因为如果用户是从第 3 方提供商(google、facebook 等)创建的,则会给出 event.data.displayName
  • 在我看来,使用客户端代码更新 users 节点的所有信息比在云功能和客户端代码之间拆分更优雅。
  • 是的。在您的用例中,云函数将尝试并行执行。我还建议使用纯客户端逻辑。 Firebase 客户端 API 设计良好,可以处理基于 Promise 的多次调用。
猜你喜欢
  • 2018-07-22
  • 2018-12-07
  • 1970-01-01
  • 2018-06-04
  • 2018-08-19
  • 1970-01-01
  • 2021-07-23
  • 2023-03-16
  • 1970-01-01
相关资源
最近更新 更多