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;
    }
  });
}

Примечание. Это универсальный метод вставки, который принимает имя коллекции с пространством имен в качестве параметра и документа. Он предназначен для вызова со стороны клиента с помощью функции обратного вызова, которая возвращает либо результат в виде идентификатора документа, либо объекта ошибки.

Другие вопросы по тегам