2016-01-17 2 views
1

Im пытается создать список «комнат». Предполагаемая последовательность:Коллекция helper выбрасывает не определенную ошибку

  1. Нажмите имя пользователя на его/ее Страница профиля
  2. Проверьте существующую комнату. Если да, идите в эту комнату, если не настроите новую комнату.

Im с использованием как dburles:collection-helpers, так и reywood:publish-composite.

Его бросает мне эту ошибку.

TypeError: Cannot read property 'username' of undefined at Document.Rooms.helpers.recName (rooms.js:18)

And line 18 is: return Meteor.users.findOne({ _id: this.receiver }).username;

т.е. _id: this.receiver не определено.

Я также попытался добавить защитные чеки в сборщики, но ошибка остается. То есть возврат user && user.username for example.

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


Соответствующие коды:

Сервер публикующие

Meteor.publish("onlusers", function(){ 
return Meteor.users.find({}); 
}); 

Rooms.js коллекция помощник

Rooms.helpers({ 
    recName: function() { 
    return Meteor.users.findOne({ _id: this.receiver }).username; 
    } 
}); 

user.js (профильный р возрастные события)

Template.usersShow.events({ 
    'click .user': function() { 
    var receiver = this._id; 
    Session.set('chatId', this._id); 
    var res = Rooms.findOne({ 
     $or: [ 
     { owner  : this._id }, 
     { receiver : this._id } 
     ] 
    }); 
    if(res){  
     Router.go('roomDetail', { "_id" : res._id }); 
    } else { 
     var newRoom = Rooms.insert({ 
     owner  : Meteor.userId(), 
     receiver : receiver, 
     username : Meteor.user().username, 
     }); 
     Session.set('roomid', newRoom); 
     Router.go('roomDetail', { "_id" : newRoom }); 
    } 
    } 
}); 

ответ

2

Ваш диагноз:

_id: this.receiver is undefined.

Может быть обманчивым. Также возможно, что подписка пользователя не полностью загружена, когда ваш помощник работает. Я помогал кому-то еще с аналогичной проблемой с публикацией-композицией на днях - подписка отмечена как готовая, когда родители готовы, но дети, возможно, еще не закончили загрузку. Я думаю об этом как об ошибке в publish-composite, все связанные объекты действительно должны быть там до того, как подписка может быть отмечена как готовая.

Вместо возвращения:

return Meteor.users.findOne({ _id: this.receiver }).username; 

Вы можете сделать:

var user = Meteor.users.findOne({ _id: this.receiver }); 
return user && user.username; 

Таким образом, вы не получите ничего назад, пока объект пользователь загружает, но не выдаст ошибку.

+0

Спасибо! Пробовал это тоже, но ошибка остается. – Thinkerer

+0

Пожалуйста, покажите, как вы публикуете пользователей, как текущего пользователя, так и других пользователей в комнатах. –

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