Несколько пользователей не получают результат от вызова метода 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