Отлов ошибок в функции ожидания маршрута Meteor Iron-Router

У меня есть функция публикации метеора, и я выдаю ошибку в этой функции публикации, чтобы ее поймал подписчик. Я использую iron-router, и в функции 'waitOn' подписываюсь на публикацию. По какой-то причине моя функция ошибки не вызывается, когда я выбрасываю ошибку из публикации, и я не знаю, почему. Помощь очень ценится!

Вот мой маршрут с моей подпиской (на 'assignmentsByGroup') и моей функцией при ошибке (onErrorfunction):

this.route('assignmentsList',
{path: '/groups/:groupId',
  waitOn: function() {
  var onErrorfunction = function(error, result)
  {
    console.log("onErrorfunction called");
    if(error)
    {
      console.log("Error!");
      alert(error.reason);
    }
  };
  return [Meteor.subscribe('assignmentsByGroup', this.params.groupId, onErrorfunction), Meteor.subscribe("groupById", this.params.groupId)];
  },
  data: function() {
    return {
      groupId: this.params.groupId
    }
  }
}
);

И вот моя функция публикации:

Meteor.publish("assignmentsByGroup", function(groupId)
{
try
{
  if(_.contains(Groups.findOne({_id: groupId}).members, this.userId))
    {
        return Assignments.find({group: groupId});
    }
    else
    {
    var errorToThrow = new Meteor.Error(401, "Access denied: you cannot view assignments unless you are a member of this group.");
        this.error(errorToThrow);
    }
}
catch(err)
{
  this.error(err);
}
});

person smulumudi    schedule 17.02.2014    source источник
comment
Это может показаться очевидным, но уверены ли вы, что ваша функция публикации достигает блока else? Можете ли вы подтвердить это с помощью console.log?   -  person snrlx    schedule 18.02.2014
comment
Я только что проверил, и он достигает блока else, так что проблема не в этом.   -  person smulumudi    schedule 18.02.2014


Ответы (2)


Проблема заключалась в моем синтаксисе обратного вызова onError. Я передал методу подписки функцию, которая интерпретируется как функция onReady и вызывается только тогда, когда this.ready() вызывается в функции публикации. Я изменил Meteor.subscribe('assignmentsByGroup', this.params.groupId, onErrorfunction) на Meteor.subscribe('assignmentsByGroup', this.params.groupId, {onError: onErrorfunction}) и все заработало! Кроме того, вы все еще можете иметь оператор try и catch в функции публикации; ошибка по-прежнему выдается правильно с ним или без него, но с ним вы также можете поймать другие внутренние ошибки сервера.

person smulumudi    schedule 19.02.2014

Удалите блок try/catch. Вы уже находитесь в функции, которая возвращает публикацию или ошибку.

Когда вы делаете попытку/поймать, фактическая ошибка, которую вы выдаете (Meteor.Error), перехватывается и передается/выбрасывается в улов как обычная ошибка javascript.

Но подписка ждет правильного Meteor.Error

person Serkan Durusoy    schedule 17.02.2014
comment
К сожалению, похоже, это не решило проблему. Даже после удаления оператора try/catch функция onError (обратный вызов) по-прежнему не вызывается. Правилен ли мой синтаксис для обратного вызова onError? - person smulumudi; 18.02.2014
comment
это выглядит вполне правильно, я не могу придумать причину, почему это не работает :( - person Serkan Durusoy; 18.02.2014