Collection2, вставка с использованием метода, исключение из уникального ограничения не обнаружено
Я создаю новый проект:
$ 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);
});
Обратите внимание, что, в отличие от прямой вставки, метод генерирует необработанное исключение! Кроме того, ошибка выдается из нашего пользовательского броска и имеет код ошибки 333.
Почему это не обрабатывается должным образом? Что я могу сделать, чтобы смягчить это, чтобы я мог что-то сделать с ошибкой (уведомить пользователя, перенаправить на страницу оригинальных документов и т. Д.)
1 ответ
По состоянию на февраль 2014 года это был запрос на улучшение отслеживания проблем collection2 по адресу https://github.com/aldeed/meteor-collection2/issues/59
Текущий обходной путь (на сервере) состоит в том, чтобы отловить ошибку отдельно и передать ее в пользовательский 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;
}
});
}
Примечание. Это универсальный метод вставки, который принимает имя коллекции с пространством имен в качестве параметра и документа. Он предназначен для вызова со стороны клиента с помощью функции обратного вызова, которая возвращает либо результат в виде идентификатора документа, либо объекта ошибки.