我创建了一个新项目:
$ mrt create sandbox
$ mrt remove autopublish
$ mrt add collection2
并使用以下代码创建一个对键具有唯一约束的简单集合
SandBoxCollection = new Meteor.Collection('sandboxcoll', {
schema: new SimpleSchema({
title: {
type: String,
min: 3,
unique: true,
index: true
}
})
});
if (Meteor.isServer) {
Meteor.publish('sandboxpub', function() {
return SandBoxCollection.find();
});
}
if (Meteor.isClient) {
Meteor.subscribe('sandboxpub');
}
Meteor.methods({
create: function(doc) {
var docId = SandBoxCollection.insert(doc, {validationContext: 'create'}, function(err, res) {
if (err) {
throw new Meteor.Error(333, SandBoxCollection.simpleSchema().namedContext('create').invalidKeys());
}
return res;
});
return docId;
}
});
我设置了一个简单的集合、pub/sub 和一个可用于插入的方法。
然后我使用浏览器控制台发出以下命令
让我们首先创建一个文档:
Meteor.call('create', {title: 'abcd01'}, function(e,r){
console.log(e ? e : r);
});
现在让我们尝试使用 collection.insert() 直接插入一个副本:
SandBoxCollection.insert({title: 'abcd01'}, function(e,r) {
console.log('error: ');
console.log(e);
console.log('errorkeys: ');
console.log(SandBoxCollection.simpleSchema().namedContext().invalidKeys());
console.log('result: ');
console.log(r);
});
我们可以看到由回调处理并记录到控制台的正确 333 错误。
现在尝试使用以下方法插入副本:
Meteor.call('create', {title: 'abcd01'}, function(e,r){
console.log(e ? e : r);
});
请注意,与直接插入不同,该方法会引发未捕获的异常!此外,错误是从我们的自定义 throw 中抛出的,错误代码为 333。
为什么处理不当?我可以做些什么来缓解这种情况,以便我可以对错误做一些事情(通知用户,重定向到原始文档页面等)