Meteor - 验证新的用户文档服务器端

时间:2016-02-13 05:44:10

标签: meteor

我对这些看似微不足道的东西遇到了麻烦,哈哈! 我有这个用户文档:

userData = {
  account: {
    type: 'free'
  },
  profile: {
    name: 'Artem',
  },
  username: 'aaa@gmail.com',
  password: '123'
};

我发送客户端的内容:Accounts.createUser(userData);
然后服务器端我想检查帐户类型是否等于'免费'。如果它没有 - 我想中止新用户创建(并希望抛出错误客户端)
我在文档中找到了两个函数,可能有助于我这样做:

  • Accounts.validateNewUser 问题:它收到了“减少”'用户对象不包含profile, username, password, email以外的属性。因此,我无法验证account.type,因为它在验证的用户对象上不存在。
  • Accounts.onCreateUser 问题:在创建通用用户对象后调用它,我无法取消在Users集合中插入新文档。它绝对需要返回用户文档。如果我返回undefined,它会在服务器上抛出错误: Exception while invoking method 'createUser' Error: insert requires an argument
    它也不允许抛出方法错误(因为它不是方法) - >因此我无法记录错误客户端。

1 个答案:

答案 0 :(得分:0)

您可以使用Accounts.validateNewUser对数据结构进行少许更改:

userData = {
  profile: {
    name: 'Artem',
    account : {
       type : 'free'
    }
  },
  username: 'aaa@gmail.com',
  password: '123'
};

然后您应该能够访问所需的数据。 据我记得,有关移除profile字段的流星论坛有一些讨论,这就是为什么我以不同方式解决这类问题的原因。对我来说Meteor.users是为了和平而不应该改变的集合 - 它可以被未来版本的流星改变。我的方法需要在开始时编写更多代码,但稍后它会得到回报,因为您可以存储有关用户的数据,Meteor.users集合具有文档数量最少的文档。

我会使用jagi:astronomy@0.12.1来创建架构和自定义方法。一般情况下,我会使用架构创建新的集合UserAccounts

UserAccount = new Astro.Class( {
    name: 'UserAccount',
    collection: 'UserAccounts',
    fields: {
       'userId'            : {type: 'string'},
       'type'              : {type: 'string', default:'free'}
    },
} )

并将架构添加到Meteor.users

User = new Astro.Class( {
    name: 'User',
    collection: Meteor.users,
    fields: {
       'services'            : {type: 'object'},
       'emails'              : {type: 'array'}
    },
    methods:{
        account : function(){
            return UserAccounts.findOne({userId:this._id})
        }
    }
} )

用法如下:

var user = Meteor.users.findOne();
user.account().type

总结:

  • Accounts.onCreateUser:始终允许创建用户帐户并始终创建与其对应的UserAccount(使用字段userId