我正在使用Meteor App,用户可以按照多步注册流程进行操作。他们首先注册,然后在访问信息中心之前通过 3个自定义表单。我在更新模式下使用 Autoform 和 Collection2 来验证不同的表单。注册后,用户会在每个表单上更新必要的值,并且字段/输入错误由Collection2处理。
我的问题是: 虽然我开始将项目的所有字段和子字段设置为可选项,但我希望将它们设为必需项,因此Collection2也可以处理丢失的输入。但是当我删除可选选项时,我的表单仍然正确更新,现在处理空字段,但用户不能再注册。
Exception while invoking method 'createUser' Error: First name is required
我目前正在调用Meteor.createUser客户端,我想知道是否有办法阻止Meteor.createUser检查插入时的所有非可选字段。我知道我可以将其称为服务器端,但我必须在提交时加密密码,我甚至不确定是否可以绕过C2验证。
用户首次注册非常重要,然后可以继续或离开并返回完成填写表格。我知道我可以在最后一个表单上使用createUser或者将所有选项都放回去并在每个字段上进行一些自定义验证,但我正在寻找一些更漂亮的"更好的"办法。任何意见都将非常感谢!
答案 0 :(得分:0)
经过多次测试,我终于找到了解决方法。将必填字段设置为在可选的嵌套模式中,以便在插入时验证不会失败。
此外,请确保您没有自动值或可选嵌套架构中最初创建的值,否则会创建它然后触发验证(两者都是我的情况,我在表格进展跟踪器上有一个autovalue,它在每个新步骤中设置和更新。
这是一个具体的例子:
Posts = new Mongo.Collection("posts");
var Schema = {};
Schema.Replies = new SimpleSchema({
owner: {
type: String
},
content: {
type: String
}
});
Schema.Posts = new SimpleSchema({
createdAt: {
type: Date,
autoValue: function() {
if (this.isInsert)
return new Date();
else if (this.isUpsert)
return {$setOnInsert: new Date()};
else
this.unset();
},
optional: true
},
content: {
type: String
},
replies: {
type: [Schema.Replies],
optional: true
},
owner: {
type: String,
autoValue: function() {
if (!this.isSet) {
return this.userId;
}
}
},
});
Posts.attachSchema(Schema.Posts);
因此,您可以拥有一个Post
,其中包含或的回复。但是,如果您决定添加回复,则 将填写嵌套架构中的所有必填字段,否则您的更新将被拒绝。您可以将此逻辑复制到任何内容(因此在我的情况下,随着我们的注册表单继续更新Meteor.user
)。希望它有所帮助。