Cloud Functions for Firebase auth.user API 具有空的 displayName



我有一个使用Firebase的Android应用程序,其中包含数据库,身份验证和云功能模块。当用户通过应用创建配置文件并设置用户全名时,值

FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
if (user != null) {
    // user signed in
    String displayName = user.getDisplayName();
    // do whatever with displayName...
} else {
    // ....
}

几乎符合预期 - 无论用户输入什么。

我还有一个云函数,它为新用户创建一个数据库记录:

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
exports.createUserRecord = functions.auth.user().onCreate(function(event) {
    const user = event.data;
    const userName = user.displayName || 'Anonymous';
    const userSignedUp = (new Date()).toJSON();
    console.log('A new user signed up: ', user.uid, userName, userSignedUp);
    return admin.database().ref('users').push({
        name: `${userName}`,
        email: `${user.email}`,
        ref: `${user.uid}`,
        signup: `${userSignedUp}`
    });
});

这基本上可以正常工作,除了日志条目和数据库列表中生成的记录Anonymous为名称值。

谁能告诉我我哪里出了问题?谢谢。

此致敬意

~托铎

更新:

忘了提,用户是使用电子邮件/密码提供程序创建的。

在FirebaseUI中,通过电子邮件/密码创建用户分两步完成:使用地址和密码创建用户,然后使用输入的用户名更新用户配置文件。 这可以在FirebaseUI RegisterEmailFragment中看到。

目前,云函数仅提供用户创建的触发器,即您正在使用的触发器functions.auth.user().onCreate() 。 没有用户配置文件更新的触发器。 创建用户时会触发触发器。事件数据包含当时存在的用户配置文件,然后才使用用户名进行更新。

您将需要使用一些其他方法来获取用户名。 一种选择是使用数据库事件来触发一个函数,该函数将在更新配置文件后检索用户数据:

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());
  })
  .catch(function(error) {
    console.log("Error fetching user data:", error);
  });

最新更新