使用 Collection2 跳过 Meteor.createUser 上的插入验证
Skipping insert validation on Meteor.createUser with Collection2
我正在开发一个 Meteor 应用程序,用户可以在该应用程序中执行多个步骤的注册过程。他们先注册,然后填写 3 个自定义表单,然后再访问仪表板。我在更新模式下使用 Autoform 并使用 Collection2 来验证不同的表单。注册后,用户更新每个表单上的必要值,fields/input 错误由 Collection2 处理。
我的问题是:
虽然我在开始项目时将所有字段和子字段都设置为可选,但我想让它们成为强制性的,这样 Collection2 也可以处理丢失的输入。但是当我删除可选选项时,我的表单仍然正确更新并且现在可以处理空字段但用户无法再注册。
Exception while invoking method 'createUser' Error: First name is required
我目前正在调用 Meteor.createUser 客户端,我想知道是否有任何方法可以防止 Meteor.createUser 在插入时检查所有非可选字段。我知道我可以将其称为服务器端,但我必须在提交时加密密码,我什至不确定我是否可以从那里绕过 C2 验证。
用户先注册然后可以继续或离开并回来完成填写表格是非常重要的。我知道我可以在最后一个表单上使用 createUser 或将所有可选内容放回去并对每个字段进行一些自定义验证,但我正在寻找一些 "prettier" 方式。任何输入将不胜感激!
经过多次测试,我终于找到了解决方法。将必填字段设置为 in optional nested schemas,这样验证就不会在插入时失败。
此外,请确保您没有自动值或从一开始就在可选的嵌套模式中创建的值,否则它会创建它然后触发验证(两者都是我的情况是,我在表单进度跟踪器上有一个自动值,它在每个新步骤上设置和更新)。
这是一个具体的例子:
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
)。希望对你有帮助。
我正在开发一个 Meteor 应用程序,用户可以在该应用程序中执行多个步骤的注册过程。他们先注册,然后填写 3 个自定义表单,然后再访问仪表板。我在更新模式下使用 Autoform 并使用 Collection2 来验证不同的表单。注册后,用户更新每个表单上的必要值,fields/input 错误由 Collection2 处理。
我的问题是: 虽然我在开始项目时将所有字段和子字段都设置为可选,但我想让它们成为强制性的,这样 Collection2 也可以处理丢失的输入。但是当我删除可选选项时,我的表单仍然正确更新并且现在可以处理空字段但用户无法再注册。
Exception while invoking method 'createUser' Error: First name is required
我目前正在调用 Meteor.createUser 客户端,我想知道是否有任何方法可以防止 Meteor.createUser 在插入时检查所有非可选字段。我知道我可以将其称为服务器端,但我必须在提交时加密密码,我什至不确定我是否可以从那里绕过 C2 验证。
用户先注册然后可以继续或离开并回来完成填写表格是非常重要的。我知道我可以在最后一个表单上使用 createUser 或将所有可选内容放回去并对每个字段进行一些自定义验证,但我正在寻找一些 "prettier" 方式。任何输入将不胜感激!
经过多次测试,我终于找到了解决方法。将必填字段设置为 in optional nested schemas,这样验证就不会在插入时失败。
此外,请确保您没有自动值或从一开始就在可选的嵌套模式中创建的值,否则它会创建它然后触发验证(两者都是我的情况是,我在表单进度跟踪器上有一个自动值,它在每个新步骤上设置和更新)。
这是一个具体的例子:
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
)。希望对你有帮助。