2016-02-13 46 views
0

我遇到了这个看似微不足道的东西的麻烦,哈尔!
我有这个用户文档:流星 - 验证新的用户文档serverside

userData = { 
    account: { 
    type: 'free' 
    }, 
    profile: { 
    name: 'Artem', 
    }, 
    username: '[email protected]', 
    password: '123' 
}; 

我敢送客户端:Accounts.createUser(userData);
然后服务器端我要检查,如果帐户类型等于“免费”。如果没有 - 我要放弃新用户创建(希望抛出错误客户端)
有我的文档已经找到2个函数大概可以帮我做到这一点:

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

你怎么样发送帐户类型的数据作为配置文件对象的一部分?然后你将可以在'Accounts.validateNewUser'中访问这个值并进行验证。 – umesh

+0

奇怪的是,你必须这样做。我提出了一个问题 - https://github.com/meteor/meteor/issues/6231 – avalanche1

回答

0

您可以使用Accounts.validateNewUser变化不大,以你的数据结构:

userData = { 
    profile: { 
    name: 'Artem', 
    account : { 
     type : 'free' 
    } 
    }, 
    username: '[email protected]', 
    password: '123' 
}; 

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

我会用jagi:[email protected]来创建架构和自定义方法。一般来说,我会创造新的集合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