我总是使用方法来插入、更新和删除。这是我的代码现在的样子:
客户端
Template.createClient.events({
'submit form': function(event, tmpl) {
e.preventDefault();
var client = {
name: event.target.name.value,
// .... more fields
}
var validatedData = Clients.validate(client);
if (validatedData.errors) {
// Display validation errors
return;
}
Meteor.call('createClient', validatedData.client, function(error) {
if (error)
// Display error
});
}
});
客户端和服务器端:
Clients = new Mongo.Collection("clients");
Clients.validate = function(client) {
// ---- Clean data ----
client.name = _.str.trim(client.name);
// .... more fields clean
// ---- Validate data ---
var errors = [];
if (!client.name)
errors.push("The name is required.");
// .... more fields validation
// Return and object with errors and cleaned data
return { errors: _.isEmpty(errors) ? undefined : errors, client: client };
}
Meteor.methods({
'createClient': function (client) {
// --- Validate user permisions ---
// If server, validate data again
if (Meteor.isServer) {
var validatedData = Clients.validate(client);
if (validatedData.errors)
// There is no need to send a detailed error, because data was validated on client before
throw new Meteor.Error(500, "Invalid client.");
client = validatedData.client;
}
check(client, {
name: String,
// .... more fields
});
return Clients.insert(client);
}
});
Meteor.call 在客户端和服务器端执行,但是如果客户端的验证失败(或者至少,我不知道如何),Meteor 没有办法停止服务器端的运行。使用这种模式,如果验证失败,我会避免使用 Meteor.call 向服务器发送数据。
我想开始使用 Collection2,但我不知道如何获得相同的模式。我发现的所有示例都涉及在客户端使用直接插入和更新以及允许/拒绝来管理安全性,但我想坚持使用 Meteor.call。
我发现在插入或更新之前我可以验证的文档,但我不知道如何让它工作:
Books.simpleSchema().namedContext().validate({title: "Ulysses", author: "James Joyce"}, {modifier: false});
我知道 autoform 包,但我现在想避免使用该包。
在使用 Meteor.call 将数据发送到服务器端之前,如何在客户端使用 Collection2 进行验证?我的模式是否错误或与 Collection2 不兼容,我需要以另一种方式来做吗?