Исключение в помощнике по шаблону: Ошибка: Ошибка соответствия

Я пытаюсь выполнить пользовательскую сортировку, используя функцию сравнения из помощника по шаблонам в Meteor.

Вот мой помощник шаблона:

Template.move_list.helpers({
  assets() {
    return Assets.find({}, { sort: sortFunction });
  }
});

А вот функция сравнения:

const sortFunction = function (doc1, doc2) {
  const barcodes = Session.get('barcodesArray');

  if (barcodes.indexOf(doc1.barcode) === -1 || barcodes.indexOf(doc2.barcode) === -1) {
    return 0;
  }

  let last = null;
  _.each(barcodes, function (barcode) {
    if (barcode === doc1.barcode) last = doc1.barcode;
    if (barcode === doc2.barcode) last = doc2.barcode;
  });

  return last === doc1.barcode ? 1 : -1;
}

ошибка

Когда страница загружается, возвращается следующая ошибка:

Exception in template helper: Error: Match error: Failed Match.OneOf, Match.Maybe or Match.Optional validation

Я поставил точку останова в Chrome в sortFunction, однако функция никогда не вводилась и точка останова не достигалась.

Конечно, ошибка не выбрасывается при удалении sort,

Рекомендации

Эта функция не очень хорошо документирована, однако вот соответствующая часть документов:

Для локальных коллекций вы можете передать функцию сравнения, которая получает два объекта документа и возвращает -1, если первый документ идет первым по порядку, 1, если второй документ идет первым, или 0, если ни один документ не предшествует другому. Это расширение Minimongo для MongoDB.

И коммит с добавлением mitar функциональности, с примером кода из теста:

var sortFunction = function (doc1, doc2) {
  return doc2.a - doc1.a;
};

c.find({}, {sort: sortFunction})

Кто-нибудь может понять эту ошибку?

1 ответ

Редактировать:

Эта проблема должна быть решена в Meteor >= v1.3.3.1.

Локальные коллекции (т. Е. Клиентские и серверные коллекции в памяти) позволят передать функцию в качестве sort пункт.


Ошибка исходит от mongo пакет, где спецификация не позволяет sort быть функцией.

@mitar изменился LocalCollection в minimongo пакет. LocalCollection является частью Mongo.Collection объект на клиенте (его _collection атрибут), но запросы по-прежнему проверяются в соответствии с оригиналом mongo спекуляция Я считаю, что это ошибка, поскольку спецификация не была обновлена ​​для отражения изменений.

Чтобы преодолеть это (тем временем), либо сделайте так, чтобы функция принимала подполе, так что sort Значение объекта:

var sortFunction = function (x, y) {
  return x - y;
};
c.find({}, {sort: {a: sortFunction}});

или используйте c._collection.find() вместо этого, который будет работать (насколько я могу судить), за исключением того, что он не будет применять какие-либо преобразования, определенные для коллекции.

var sortFunction = function (doc1, doc2) {
  return doc2.a - doc1.a;
};
c._collection.find({}, {sort: sortFunction});
Другие вопросы по тегам