我尝试在Firebase云功能中实现.onCreate
firebase云功能codeLab(https://codelabs.developers.google.com/codelabs/firebase-cloud-functions/#7)
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应用中当前用户的displayName
实例中的FIRUser
属性在注册过程后正确填充。
我认为FirebaseUI中的某种错误是首先使用电子邮件创建一个空用户,触发.onCreate
触发器并且仅在此填充displayName
属性之后。是吗?
如果没有,原因可能是什么?
答案 0 :(得分:6)
这个答案不是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问题。它适用于我自己的测试,但希望有人能够在没有解决方法的情况下解决实际问题。
如果这对你不起作用,请告诉我!干杯!
答案 1 :(得分:-1)
要设置用户显示名称,首先必须创建用户。
首先没有显示名称属性。
创建用户后,您可以触发修改请求以将显示名称添加到用户。