2015-06-19 70 views
0

民间,创建用户验证错误的方法与aldeed集合

我需要帮助。我已经有一段时间了,现在似乎无法解决这个问题。它应该很简单。我正在使用aldeed collection2,我似乎无法通过创建用户帐户方法抛出验证错误。我的架构是非常标准的,附着于meteor.users集合:

Schema={} 
//SimpleSchema.debug = true; 


Schema.UserProfile = new SimpleSchema({ 

    picture: { 
    type: String, 
    optional: true 
    }, 
    updatedAt: { 
    type: Date, 
    autoValue: function() { 
     if (this.isUpdate) { 
     return new Date(); 
     } 
    }, 
    denyInsert: true, 
    optional: true 
    }, 
    roles: { 
    type: String, 
    optional: true 
    } 
}); 

Schema.User = new SimpleSchema({ 
    _id: { 
    type: String, 
    regEx: SimpleSchema.RegEx.Id, 
    optional: true, 
    denyUpdate: true 
    }, 

    emails: { 
    type: [Object], 
    optional: true 
    }, 
    "emails.$.address": { 
    type: String, 
    regEx: SimpleSchema.RegEx.Email, 
    label: "" 

    }, 
    "emails.$.verified": { 
    type: Boolean, 
    optional: true 
    }, 
    createdAt: { 
    optional: true, 
    type: Date, 
    autoValue: function() { 
     if (this.isInsert) { 
     return new Date; 
     } else if (this.isUpsert) { 
     return {$setOnInsert: new Date}; 
     } else { 
     this.unset(); 
     } 
    } 
    }, 
    profile: { 
    type: Schema.UserProfile, 
    optional: true 
    }, 
    services: { 
    type: Object, 
    optional: true, 
    blackbox: true 
    }, 

    // Option 2: [String] type 
    // If you are sure you will never need to use role groups, then 
    // you can specify [String] as the type 
    roles: { 
    type: [String], 
    optional: true, 
    autoValue: function() { 
     if (this.isInsert) { 
     return ['user']; 
     } else if (this.isUpsert) { 
     return {$setOnInsert: ['user']}; 
     } else { 
     this.unset(); 
     } 
    } 
    }, 

    password: { 
    type: String, 
    label: "Password", 
    min: 6 
    } 

}); 

/* Attach schema to Meteor.users collection */ 
Meteor.users.attachSchema(Schema.User); 

用于创建用户我的服务器上的方法是象下面这样:

Accounts.config({ 
    forbidClientAccountCreation : true 
}); 

//creates user on server 
Meteor.methods({ 
    createNewUserAccount: function(userdata) { 
    var userId; 
    check(userdata, Schema.User); 
    //console.log(userdata); 

    userId = Accounts.createUser({ 
     email: userdata.emails[0].address, 
     password: userdata.password, 
     profile: userdata.profile 
    }); 
    //console.log(userId); 
    return userId; 
    } 
}); 

Accounts.onCreateUser(function(options, userdata) { 
    //user.profile = {}; 
    // we wait for Meteor to create the user before sending an email 
    //need to address the exception when existing email is tried for signing up 
    Meteor.setTimeout(function() { 
    Accounts.sendVerificationEmail(userdata._id); 
    }, 2 * 1000); 
return userdata; 
}); 

为我的客户,我有以下的注册。 js

Template.signup.events({ 
    'submit form': function(e){ 
    // Prevent form from submitting. 
    e.preventDefault(); 
    //console.log(doc); 
    user = { 
     'email.$.address': $('[name="emails.0.address"]').val(), 
     password: $('[name="password"]').val() 
    }; 

    Meteor.call('createNewUserAccount', user, function(error) { 
     if (error) { 
     return alert(error.reason); 
     } else { 
     Router.go('/'); 
     } 
    }); 

    } 

有谁知道我在做什么错?该架构不验证电子邮件address.I得到错误: email.0.address不是由规划允许的

回答

1

你创建一个对象:

user = { 
    'email.$.address': $('[name="emails.0.address"]').val(), 
    password: $('[name="password"]').val() 
}; 

的关键是文字字符串'email.$.address'

所以,当你这样做:

userId = Accounts.createUser({ 
     email: userdata.emails[0].address, 
     password: userdata.password, 
     profile: userdata.profile 
    }); 

email密钥找不到userdata.emails[0],因为没有emails密钥。相反,关键是'email.$.address'。另外,架构没有名为email.$.address的密钥。它有一个所谓的emails.$.address

尝试:

Template.signup.events({ 
    'submit form': function(e){ 
    // Prevent form from submitting. 
    e.preventDefault(); 
    //console.log(doc); 
    user = { 
     'emails.$.address': $('[name="emails.0.address"]').val(), 
     password: $('[name="password"]').val() 
    }; 

    Meteor.call('createNewUserAccount', user, function(error) { 
     if (error) { 
     return alert(error.reason); 
     } else { 
     Router.go('/'); 
     } 
    }); 

    } 

然后

//creates user on server 
Meteor.methods({ 
    createNewUserAccount: function(userdata) { 
    var userId; 
    check(userdata, Schema.User); 
    //console.log(userdata); 

    userId = Accounts.createUser({ 
     email: userdata['emails.$.address'], 
     password: userdata.password, 
     profile: userdata.profile 
    }); 
    //console.log(userId); 
    return userId; 
    } 
}); 
+0

THKS很多。我在电子邮件:userdata。['emails。$。address'],上得到了一个编译错误。意外的标记。 – flt123

+0

哦,对不起,请删除userdata和[ – fuzzybabybunny

+0

很多。它现在有效 – flt123