使用Collection2在Meteor.createUser上跳过插入验证

时间:2015-07-29 23:13:05

标签: validation meteor meteor-autoform meteor-collection2

我正在使用Meteor App,用户可以按照多步注册流程进行操作。他们首先注册,然后在访问信息中心之前通过 3个自定义表单。我在更新模式下使用 Autoform Collection2 来验证不同的表单。注册后,用户会在每个表单上更新必要的值,并且字段/输入错误由Collection2处理。

我的问题是: 虽然我开始将项目的所有字段和子字段设置为可选项,但我希望将它们设为必需项,因此Collection2也可以处理丢失的输入。但是当我删除可选选项时,我的表单仍然正确更新,现在处理空字段,但用户不能再注册。

Exception while invoking method 'createUser' Error: First name is required

我目前正在调用Meteor.createUser客户端,我想知道是否有办法阻止Meteor.createUser检查插入时的所有非可选字段。我知道我可以将其称为服务器端,但我必须在提交时加密密码,我甚至不确定是否可以绕过C2验证。

用户首次注册非常重要,然后可以继续或离开并返回完成填写表格。我知道我可以在最后一个表单上使用createUser或者将所有选项都放回去并在每个字段上进行一些自定义验证,但我正在寻找一些更漂亮的"更好的"办法。任何意见都将非常感谢!

1 个答案:

答案 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)。希望它有所帮助。