如何规范Meteor中不同结构的用户数据?

时间:2017-12-04 11:01:57

标签: meteor

我的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,
        },
      },
    );
  },
});

1 个答案:

答案 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数组始终包含电子邮件,无论用户选择使用哪种登录方式。