Nano Hash - криптовалюты, майнинг, программирование

Железный маршрутизатор / проблема с данными пользователя в Meteor

Я относительно новичок в Meteor и некоторое время застрял в этой проблеме. У меня есть маршрут /users/:_id, который должен отображать детали, относящиеся к этому идентификатору пользователя. Однако всякий раз, когда я выбираю этот маршрут, он отображает информацию для текущего пользователя, вошедшего в систему, а НЕ для пользователя, чьи данные я хочу просмотреть.

Вот мой маршрут:

Router.route('/users/:_id', {name: 'Users', controller: 'usersDetailController'});

Вот мои пользователиDetailController:

usersDetailController = RouteController.extend({
waitOn: function () {
    Meteor.subscribe('userProfileExtended', this.params._id);
},

onBeforeAction: function () {
    var currUserId = Meteor.userId();
    var currUser = Meteor.users.findOne({_id: currUserId});
    console.log('admin? ' + currUser.isAdmin);
    if (!currUser.isAdmin) {
        this.render('accessDenied');
    } else {
        this.next();
    }
},
action: function() {
    this.render('Users');
}

});

А вот мой сервер/публикация:

Meteor.publish('userProfileExtended', function() {
return Meteor.users.find({_id: this.userId});

});

Шаблон сведений о пользователе:

<template name="Users">

<form>
{{#with user}}

<div class="panel panel-default">
    <div class="panel-heading">{{profile.companyName}} Details</div>
    <div class="row">
        <div class="col-md-4">
            <div class="panel-body">
                <p><label>Company: </label><input id="Company" type="text" value={{profile.companyName}}></p>
                <p><label>Email: </label><input id="Email" type="text" value={{emails.address}}></p>
                <p><label>Phone: </label><input id="Phone" type="text" value={{profile.phoneNum}}></p>
                <p><label>Tire Markup: </label><input id = "tireMarkup" type="text" value={{profile.tireMarkup}}></p>
                <p><button class="saveUserDetails">Save</button></p>
                <p><button class="deleteUser">Delete User</button></p>
            </div>
        </div>

        </div>
    </div>


{{/with}}

Вот мой помощник по шаблонам:

Template.Users.helpers({
user: function() { 
return Meteor.users.findOne();
}

}); Кто-нибудь может помочь? Я думаю, проблема в том, как я ссылаюсь на "this.userId"...

Спасибо!!

31.03.2015

Ответы:


1

Вам нужно изменить функцию публикации, чтобы использовать параметр userId, который вы указываете при подписке:

Meteor.publish('userProfileExtended', function(userId) {
  return Meteor.users.find(userId,{
    fields:{
      'username':1,
      'profile.firstName':1,
      'profile.lastName'
    }
  });
});

В функции публикации userId будет равно любому значению, с которым вы вызываете Meteor.subscribe, в этом случае оно будет содержать this.params._id.

Остерегайтесь использовать правильный синтаксис для параметров маршрута, если вы объявляете путь /users/:_id, вам нужно ссылаться на параметр, используя this.params._id.

Также обратите внимание, что небезопасно публиковать весь пользовательский документ клиенту, если вам нужно показать только определенные поля в интерфейсе, поэтому вы хотите использовать параметр fields для Collection.find, чтобы публиковать только подмножество пользовательских документов.

РЕДАКТИРОВАТЬ :

Я бы рекомендовал использовать функцию route data, чтобы указать контекст данных, который вы хотите применить при рендеринге вашего шаблона, примерно так:

data: function(){
  return {
    user: Meteor.users.findOne(this.params._id)
  };
}
31.03.2015
  • Спасибо за ваш ответ - я попробовал ваше предложение, но у меня все еще возникает та же проблема... Я также изменил this.params.id на this.params._id в функции подписки. Есть ли что-то еще, что мне нужно изменить? 31.03.2015
  • кроме того, не будет ли userId ссылаться на вошедшего в систему пользователя? 31.03.2015
  • Можете ли вы также опубликовать шаблон сведений о пользователе? 31.03.2015
  • Откуда взялся помощник пользователя? Это помощник, объявленный в вашем шаблоне, или он ссылается на что-то, что вы возвращаете из своей функции данных маршрута? 31.03.2015
  • Я только что добавил свой вспомогательный шаблон. Спасибо! 31.03.2015
  • Помощник, вероятно, является проблемой: используя findOne, вы возвращаете ЛЮБОГО пользователя, доступного на клиенте, и это оказывается вошедший в систему пользователь, а не тот, для которого вы хотите отобразить подробности. Переработайте свой код, чтобы избавиться от этого помощника и вместо этого использовать функцию данных в своем маршруте (кстати, отредактировал мой ответ). 31.03.2015
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..