使用 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 )。希望对你有帮助。