Несколько пользователей не получают результат от вызова метода Meteor - работает один раз, затем возвращает undefined?

Хорошо, это интересный. Я сортирую список пользователей в Meteor и пытаюсь вернуть клиенту индексный номер пользователя. то есть я хочу, чтобы первый созданный пользователь был позицией 1, второй созданный пользователь был позицией 2, третий пользователь позицией 3 и т. д.

Я использую метод Meteor на сервере:

Meteor.methods({
  setPosition: function(userId) {
    let usersArray = Meteor.users.find({}, {sort: {createdAt: 1}}).fetch();
    if (!this.userId) {
      throw new Meteor.Error('not-authorized');
    }
    let pos = [];
    for (i = 0; i < usersArray.length; i ++) {
      if (usersArray[i]._id === this.userId) {
         pos = i + 1;
       }
         console.log('this is the position', pos);
         return pos;
     };
    }
  }); //Meteor methods
}//end of meteor isServer

Приведенный выше серверный код отлично работает в терминале, ЗА ИСКЛЮЧЕНИЕМ строки "return pos", которая заставляет код доставлять значение клиенту для первого пользователя (я вижу позицию 1), но прерывается для последующих пользователей (res не определено), Если я уберу строку "return pos", то код отлично работает на сервере для ВСЕХ пользователей, но я не могу получить ни одного результата от моего вызова метода Meteor на клиенте.

У этого клиентского кода ниже возникают проблемы с получением результата от вызова метода на сервере, и я не знаю почему:

Tracker.autorun(() => {
  Meteor.subscribe('position');
    Meteor.call('setPosition', Meteor.userId(), (err, res) => {
      if (err) {
        throw new Meteor.Error(err.message);
        console.log(err);
      } else {
        console.log(res);
        console.log(Meteor.userId());
        Session.set('position', res);
      }
    });
});

Кроме того, я новичок, поэтому я прошу прощения за любые очевидные ошибки форматирования, пожалуйста, укажите, если вы чувствуете необходимость. Спасибо!

1 ответ

Решение

Давайте просто скажем, что этот подход вряд ли будет хорошо масштабироваться, поскольку чем больше у вас пользователей, тем больше времени потребуется, чтобы найти позицию пользователя в списке пользователей.

Предполагая, что позиция пользователя никогда не меняется (т.е. вас не волнует удаление - 4-й пользователь всегда 4-й, даже если #3 удаляется), вам лучше добавить sequence ключ к объекту пользователя при создании пользователя. Вы можете посмотреть порядковый номер последнего созданного пользователя и увеличить его на единицу, чтобы передать его следующему пользователю. Вы хотите, чтобы этот ключ был проиндексирован, конечно. Тогда каждый пользователь может узнать свой порядковый номер, просто Meteor.user().sequence

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