我的Meteor应用中的用户可以手动创建帐户'或者使用accounts-facebook包。
如果他们手动创建帐户,那么在数据库中,他们的电子邮件就像这样存储:
emails: [address: 'hi@gmail.com', verified: false]
但如果他们使用Facebook登录,那么它的存储方式如下:
services: {
facebook: {
email: "jamesweblondon@gmail.com"
}
}
我有一个用户帐户页面,我需要在其中显示用户电子邮件并允许他们进行更改。我该如何处理不同的结构?
我制作了这个React组件来显示用户的电子邮件。当我刚刚使用默认的Meteor用户配置文件时,它已经工作了,但是现在我已经添加了Facebook登录错误,因为props.user.emails存在。
<div className="form-primary__row">
<label>Email:</label>
{props.user.emails.map((item, i) => {
return (
<input defaultValue={item.address} key={i} name="email" />
);
})}
</div>
这是我用户更新电子邮件的方法。当我刚拥有Meteors账户但却没有与Facebook合作时,它也有效。
Meteor.methods({
'user.updateEmail'({ email }) {
Meteor.users.update(
{ _id: Meteor.userId() },
{
$set: {
'emails.0.address': email,
'emails.0.verified': false,
},
},
);
},
});
答案 0 :(得分:1)
一种方法是使用Accounts.onCreated()
该函数应该返回用户文档(传入的文档) 或者需要进行任何修改的新创建的对象。 返回的文档直接插入Meteor.users 集合。
Accounts.onCreateUser(function (options, user) {
// if the account is created using the manual approach,
// simply return the user object that will be inserted into
// the Users collection.
if (!user.services.facebook) {
return user;
}
// if user is created using fb's API,
// manually set the emails array, then return the user object
// which will be inserted into the Users collection.
user.username = user.services.facebook.name;
user.emails = [{address: user.services.facebook.email}];
return user;
});
上述内容确保emails
数组始终包含电子邮件,无论用户选择使用哪种登录方式。