我尝试像在 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/