我创建了一个新项目:
$ 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。
为什么处理不当?我该怎么做才能缓解这个问题,以便我可以对错误做些什么(通知用户,重定向到原始文档页面等)
答案 0 :(得分:0)
截至2014年2月,这是针对https://github.com/aldeed/meteor-collection2/issues/59
上的collection2问题跟踪器的增强请求当前的解决方法(在服务器上)是单独捕获错误并将其提供给自定义Meteor.Error,如:
if (Meteor.isServer) {
Meteor.methods({
insertDocument: function(collection, document) {
check(collection, String);
check(document, Object);
var documentId = '',
invalidKeys = [];
function doInsert() {
documentId = SandboxProject.Collections[collection + 'Collection'].insert(document, {validationContext: collection + 'Context'});
}
try {
doInsert();
} catch (error) {
invalidKeys = SandboxProject.Collections[collection + 'Collection'].simpleSchema().namedContext(collection + 'Context').invalidKeys();
error.invalidKeys = invalidKeys;
throw new Meteor.Error(333, error);
}
return documentId;
}
});
}
注意:这是一种通用插入方法,它将命名空间集合名称作为参数和文档。它旨在从客户端调用一个回调函数,该函数返回结果作为文档id或错误对象。