我已经在我的网站上启用了facebook,google和常规注册/登录功能。我遇到的问题是电子邮件地址存储在不同的字段中,具体取决于用户首次加入的方式。
对于普通用户,它位于字段emails[0].address
中。对于Facebook和经过Google身份验证的用户,它位于services[0].email
字段中。
在客户端的各个地方(模板,事件)和服务器(方法)上,我只想调用一个方法来确定要使用哪个字段并返回电子邮件地址。我也想为验证领域做类似的事情。
我对流星来说相当新,到目前为止我发现完成上述操作的唯一方法是在客户端和服务器上重复相同的逻辑,这对我来说并不合适。
答案 0 :(得分:1)
最好的办法是将电子邮件地址转移到电子邮件地址'如果他们第一次使用Facebook,谷歌或其他服务登录。这也可以让你在未来添加其他服务时更加充实,因为meteor将始终使用emails.address
(包括在其他包中)
服务器端代码:
Accounts.onCreateUser(function(user) {
user.emails = user.emails || []; //If its null set it to an empty array
if(user.services.facebook) {
user.emails.push({address: user.services.facebook.email, verified: false});
}else if(user.services.google) {
user.emails.push({address: user.services.google.email, verified: false});
}
return user;
});
然后,您每次都可以查看Meteor.user().emails[0].address
。
注意:如果由于autopublish
软件包未发布,您可能必须发布emails
字段才能在客户端上运行。
对于之前已登录过的用户,您可能还必须首次运行此操作:
Meteor.startup(function() {
Meteor.users({'emails':{$exists: false}}).fetch().forEach(function(user) {
var email = (user.services.facebook || user.services.google).email;
if(email) Meteor.users.update({_id: user._id},{$push:{emails:{address: email, verified: false}}});
});
});
我不确定facebook和google是否都在email
密钥中使用services
,如果他们这样做,则应该可以正常工作。如果他们没有,您可以编辑用于谷歌或Facebook的密钥,例如,如果一个是emailAddress
而不是email
。