在Meteor上,如何在客户端验证Collection2?

在Meteor上,如何在客户端验证Collection2?,meteor,meteor-collection2,Meteor,Meteor Collection2,我总是使用插入、更新和删除的方法。这就是我的代码刚才的样子: 客户端 Template.createClient.events({ “提交表单”:函数(事件,tmpl){ e、 预防默认值(); 变量客户端={ 名称:event.target.name.value, //……更多领域 } var validatedData=Clients.validate(client); 如果(validatedData.errors){ //显示验证错误 返回; } Meteor.call('createC

我总是使用插入、更新和删除的方法。这就是我的代码刚才的样子:

客户端

Template.createClient.events({
“提交表单”:函数(事件,tmpl){
e、 预防默认值();
变量客户端={
名称:event.target.name.value,
//……更多领域
}
var validatedData=Clients.validate(client);
如果(validatedData.errors){
//显示验证错误
返回;
}
Meteor.call('createClient',validatedData.client,函数(错误){
如果(错误)
//显示错误
});
}
});
客户端和服务器端:

Clients=newmongo.Collection(“客户”);
Clients.validate=函数(客户端){
//----干净的数据----
client.name=u.str.trim(client.name);
//……更多的田地干净了
//----验证数据---
var错误=[];
如果(!client.name)
错误。推送(“需要名称”);
//…更多字段验证
//返回并删除包含错误和已清除数据的对象
返回{errors:{.isEmpty(errors)→未定义:errors,client:client};
}
流星法({
“createClient”:函数(客户端){
//---验证用户权限---
//如果是服务器,请再次验证数据
if(Meteor.isServer){
var validatedData=Clients.validate(client);
如果(validatedData.errors)
//不需要发送详细的错误,因为之前在客户端上验证过数据
抛出新Meteor.Error(500,“无效客户端”);
client=validatedData.client;
}
检查(客户、{
名称:String,
//……更多领域
});
返回客户。插入(客户);
}
});
Meteor.call在客户端和服务器端执行,但是如果客户端的验证失败(或者至少我不知道如何),Meteor无法停止服务器端的运行。使用这种模式,我可以避免在验证失败时使用Meteor.call将数据发送到服务器

我想开始使用Collection2,但我不知道如何获得相同的模式。我发现的所有示例都涉及到在客户端使用直接插入和更新以及允许/拒绝管理安全性,但我想坚持使用Meteor.call

我在文档中找到了可以在插入或更新之前验证的内容,但我不知道如何使其生效:

Books.simpleSchema().namedContext().validate({title:“Ulysses”,author:“James Joyce”},{modifier:false});
我知道autoform包,但我现在想避免使用该包


在使用Meteor.call将数据发送到服务器端之前,如何在客户端使用Collection2进行验证?我的模式是错误的还是与Collection2不兼容?我需要用另一种方式来做吗?

在不到30行的代码中,您可以为Collection2编写自己的、功能齐全的验证包。让我们看一个例子:

“严格使用”//保持清洁
var simplyValid=window.simplyValid={}//好的,没有那么干净(全局对象)
simplyValid.RD=新的ReactiveDict()//在此处存储错误消息
/**
* 
*@param data是一个对象,其集合名、索引(如果存储数组)和字段名存储在架构中(例如“foo.$.bar”)
*@param value是用户输入的值
*@如果有效,则返回{boolean}true
*/
simplyValid.validateField=函数(数据、值){
var schema=R.C[data.collection]。\u c2.\u simpleSchema;//从本地集合访问架构,“R.C”是我存储所有集合的地方
var字段=data.field;
var fieldVal=field.replace('$',data.idx);//为每个数组val创建一个单独的键
var objToValidate={};
var dbValue=schema.\u schema[field].dbValue;//自定义转换(标准到公制、美元到美分等)忽略
if(dbValue&&value)value=dbValue.call({value:value});//忽略
objToValidate[field]=value;//创建要清理的文档
schema.clean(objToValidate,{removemptystrings:false});//清除数据(trim等)
var isValid=schema.namedContext().validateOne(objToValidate,字段,{extendedCustomContext:true});//最后,我们验证
如果(有效){
simplyValid.RD.set(fieldVal,未定义);//RD存储错误消息,如果它有效,则不会有错误消息
返回true;
}
var errorType=schema.namedContext()。\u getInvalidKeyObject(field).type;//获取错误类型
var errorMessage=schema.messageForError(errorType,field);//获取给定错误类型的消息
simplyValid.RD.set(fieldVal,errorMessage);//设置错误消息。在错误消息上进行验证非常重要,因为更改输入可以消除错误消息并生成另一条错误消息
返回false;
};
simplyValid.isFieldValid=函数(字段){
返回simplyValid.RD.equals(字段,未定义);//获取有效状态的一个非常便宜的函数
};

您可以随意挑选您需要的部分,并向我提出任何问题。

您可以将模式发送到客户端,并在发送到服务器之前进行验证。如果要使用“集合”,则需要将架构附加到集合,并使用
插入
,这是您不想要的。因此,对于您的场景,最好的选择是将架构发送到客户端并使用它进行验证

另外,请重新考虑使用mini mongo,而不是对所有内容都使用方法,这将为您节省大量时间,并且不会因为您使用方法而认为您的应用程序是安全的