2015-02-12 2 views
1

Я только что закончил с черновиком моего приложения и подумал, что пришло время удалить автоматический и небезопасный режим. Я начал передавать все измененные методы обновления и вставки, которые я вызывал на клиенте для методов. Но теперь у меня возникли проблемы , возвращая имя пользователя из ID.Получение имени пользователя из ID без автообновления

Моя функция перед: (который работал, пока не удалены autopublish)

challenger: function() { 
    var postId = Session.get('activePost'); 
    var post = Posts.findOne(postId); 
    if (post.challenger !== null) { 
    var challenger = Meteor.users.findOne(post.challenger); 
    return challenger.username; 
    } 
    return false; 
} 

Теперь я пытаюсь:

Template.lobby.helpers({ 
    challenger: function() { 
    var postId = Session.get('activePost'); 
    var post = Posts.findOne(postId); 
    if (post.challenger !== null) { 
     var userId = post.challenger; 
     Meteor.call('getUsername', userId, function (err, result) { 
     if (err) { 
      console.log(err); 
     } 
     return result; 
     }); 
    } 
    return false; 
    }, 

Использование:

Meteor.methods({ 
    getUsername: function(userId) { 
     var user = Meteor.users.findOne({_id: userId}); 
     var username = user.username; 
     return username; 
    }, 
    ... 
}) 

I попытались заблокировать код, возвращая значения только после их определения, а console.loggi ng в call-callback (который вернул правильное имя пользователя для консоли, но вид не изменился)

Надеясь, что кто-то найдет явную ошибку, которую я делаю, потому что я пробовал уже 3 часа, t выяснить, почему значение будет возвращено в консоли, но не будет возвращено в шаблон.

ответ

4

Помощники должны бежать синхронно и не должны иметь никаких побочных эффектов. Вместо вызова метода для извлечения пользователя вы должны убедиться, что пользователь (ы), который вам нужен для публикации этого маршрута/шаблона. Например, ваш маршрутизатор может ждать подписки как для активной почты, так и для соперника. После того, как у клиента есть необходимые документы, вы можете вернуться к исходному коду.

+0

Спасибо, это сработало. Я подписался в какой-то момент, но забыл опубликовать. Итак, теперь у меня есть: Meteor.publish ('users', function() { return Meteor.users.find(); }); –

+1

Публикация всех пользователей, вероятно, непрактична для достаточно большого приложения. И даже для небольшого приложения вы хотите, чтобы в белый список полей было что-то вроде '{fields: {username: 1, profile: 1}}', чтобы вы не публиковали конфиденциальные данные, такие как хэши паролей и токены резюме. – user3374348

Смежные вопросы