ios - 电子邮件注册方法的 .onCreate 触发器中未定义用户显示名称

标签 ios firebase firebase-realtime-database firebase-authentication

我尝试像在 Firebase 云函数 codeLab ( https://codelabs.developers.google.com/codelabs/firebase-cloud-functions/#7 ) 中那样实现 .onCreate firebase 云函数

exports.addWelcomeMessages = functions.auth.user().onCreate(event => {
  const user = event.data;
  console.log('user: %j', user);
  const fullName = user.displayName;

  return admin.database().ref('messages').push({
    name: 'Firebase Bot',
    text: `${fullName} signed in for the first time! Welcome!`
  });
});

在我的客户端 iOS 应用程序中,我通过 FirebaseUI 使用电子邮件身份验证流程,这需要用户输入他的电子邮件、姓名和密码才能注册。用户注册后,云函数中的 .onCreate 触发器触发,但 user 结构不包含 displayName 数据:

user: {"email":"my@gmail.com","metadata":{"createdAt":"2017-04-05T05:30:05.000Z","lastSignedInAt":"2017-04-05T05:30:05.000Z"},"uid":"wpIPNvf2suQdMumsEyXA5lQatt23"}

注意:iOS 应用中当前用户的 FIRUser 实例中的 displayName 属性在注册过程后正确填写。

我假设它是 FirebaseUI 中的某种错误,它首先使用电子邮件创建一个空用户,触发 .onCreate 触发器,并且仅在此之后填充 displayName 属性。是吗?

如果不是,是什么原因造成的?

最佳答案

这个答案不是 Firebase 开发人员想要的正确方法,但鉴于文档中的代码不起作用,因为在首次创建帐户时未检索用户 displayName 属性,我想出了一个简单的解决方法。

此代码仅使用此处的管理 Node.js SDK: ( https://firebase.google.com/docs/auth/admin/manage-users )

代码如下:

const admin = require('firebase-admin'); // This is the required SDK
admin.initializeApp(functions.config().firebase); // SDK initialization is required 

exports.addWelcomeMessages = functions.auth.user().onCreate(event => {
  const user = event.data;
  console.log('user: %j', user);
  const uid = user.uid;

  return admin.auth().getUser(uid)
  .then(function(userRecord){
    // See the UserRecord reference doc for the contents of userRecord.
    console.log("Successfully fetched user data:", userRecord.toJSON());
    const fullName = userRecord.displayName || 'Anonymous';
    return admin.database().ref('messages').push({
      name: 'Firebase Bot',
      text: `${fullName} signed in for the first time! Welcome!`
    });
  })
  .catch(function(error){
    console.log("Error fetching user data:", error);
  });
});

此代码必须对数据库进行额外的调用,但至少解决了 onCreate 事件数据中 displayName 不可用的问题。它在我自己的测试中有效,但希望有人能够在没有解决方法的情况下解决实际问题。

如果这对您不起作用,请告诉我!干杯!

关于ios - 电子邮件注册方法的 .onCreate 触发器中未定义用户显示名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43223896/

相关文章:

firebase - 如何从Firebase DB检索子数据的值?

ios - 如何在 iOS 文件系统中存储来自 UnsafeMutablePointer 的数据

android - 聊天应用程序中的分页库

ios - 如何从 firebase 数据库设置个人资料图片

javascript - (Javascript)Firebase错误,重新连接到互联网后自动多次写入数据库

Firebase 扇出 - 最具成本效益的方法?

ios - OpenGL ES 2.0 球体

iphone - 为 UISlider 使用字符串数组

objective-c - 以编程方式绘制粗略的线条

android - Android 6 和 5 上的 Firebase InApp 消息传递崩溃