2017-01-12 4 views
1

Вместо базового модуля CRUD articles, который указан, у меня есть аналогичный код, называемый friends. A friend - это просто еще один user, но он отделен от модуля user. Я пытаюсь сделать это, когда пользователь выбирает, чтобы увидеть список друзей, они видят список друзей, а не все те, которые хранятся в коллекции friends в монго. Структура friend в коллекции Монго является:Немедленный вызов api по умолчанию при выборе списка - MEAN.JS

{ 
    "_id" : ObjectId("587b9e16d1bdf314181b354e"), 
    "user" : ObjectId("5867c5e92fa4e91008788f80"), 
    "added" : ISODate("2017-01-15T16:06:46.975Z"), 
    "friend" : { 
     "firstName" : "b", 
     "lastName" : "b", 
     "email" : "[email protected]", 
     "profileImageURL" : "modules/users/client/img/profile/default.png", 
     "roles" : [ 
       "user" 
     ], 
     "created" : "2017-01-11T17:28:19.849Z", 
     "__v" : 0, 
     "username" : "bbbbbb", 
     "provider" : "local", 
     "displayName" : "b b", 
     "_id" : "58766b337f091f842addfd5a" 
    }, 
    "__v" : 0 
} 

Так user поля пользователя, который этот friend назначается и friend объекта является фактическим другом.

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

/апи/: USERID/друзей /: friendId

/API/: идентификатор пользователя/друзей

Я понял, что (и это то, что по умолчанию в MEAN.JS), на клиенте, если пользователь выбирает, чтобы увидеть список друзей, вызов немедленно делается, чтобы увидеть ВСЕ(/api/friends) друзей в коллекции в монго.

Я просмотрел весь клиент, но не вижу, где этот звонок сделан!

Что я хочу сделать, это найти, где этот вызов сделан, и изменить его так, чтобы он включал :userId в качестве параметра, чтобы получить доступ к этим друзьям.

Как он смотрит на меня, как только вы нажмете шаблон для просмотра друзей, контроллер должен сделать ngResource запрос к FriendsService, чтобы получить друг конкретного пользователя:

function FriendsService($resource) { 
    return $resource('api/:userId/friends/:friendId', { 
     userId: '@user', 
     friendId: '@_id' 
    }, { 
     update: { 
      method: 'PUT' 
     } 
    }); 
} 

. .. но, очевидно, это не так.

EDIT:

Я рад, что $stateProvider настроен в конфигурации на стороне друзей модуль клиента:

$stateProvider 
    .state('friends', { 
     abstract: true, 
     url: '/friends', 
     template: '<ui-view/>' 
    }) 
    .state('friends.list', { 
     url: '', 
     templateUrl: 'modules/friends/client/views/list-friends.client.view.html', 
     controller: 'FriendsListController', 
     controllerAs: 'vm', 
     data: { 
      pageTitle: 'Friends List' 
     } 
    }); 

Так что, когда я ударил URL /friends, что должно произойти, так как не связан ли контроллер или шаблон?

Однако в friends.client.config.js, сервис меню:

// Add the dropdown list item 
menuService.addSubMenuItem('topbar', 'friends', { 
    title: 'List Friends', 
    state: 'friends.list' 
}); 

Так мое понимание, что если опция подменит в список друзей в пользовательском интерфейсе щелкает, он использует то состояние, которое отображает на FriendsListContoller ,

function FriendsListController(FriendsService) { 
    var vm = this; 

    vm.friends = FriendsService.query(); 
} 

Так будет запрашивать ngResource в FriendsService. FriendsService:

function FriendsService($resource) { 
    return $resource('api/:userId/friends/:friendId', { 
     userId: '@user', 
     friendId: '@_id' 
    }, { 
     update: { 
      method: 'PUT' 
     } 
    }); 
} 

Так что мне кажется, что, когда пользователь выбирает, чтобы увидеть список друзей, /api/:userId/friends/:friendId следует.

Дело в том, что я могу видеть в моей консоли, что при выборе, чтобы просмотреть список друзей, вызов /api/friends делается вместо того, чтобы, который не получает все друзей в коллекции в Монго независимо от того, кто они назначены :

enter image description here

вызов явно делается от клиента где-то, но не могу найти где.

3 вопросы:

  1. Является ли моя логика правильная? В том смысле, что, когда пользователь выбирает просмотр списка друзей, запрашивается услуга?
  2. В службы, PARAMS userId и friendId устанавливаются @user(который я установил) или @_id(который был уже там). Моя презумпция заключалась в том, что это поля в коллекции в монго, верно? В любом случае я могу отлаживать значения, которые передаются в этот вызов?
  3. Где находится звонок «/ api/friends»? Как, по логике вещей в моей голове, я не могу найти, где она вызывается в клиенте (вероятно, потому что я не знаю достаточно о структуре MEAN.JS пока)

ответ

1

Исправление было относительно простым, и я чувствую себя глупо, потому что не думал об этом раньше.
MEAN.JS имеет Authentication завод, который может вернуть текущего пользователя в сеансе (Authentication.user)
Просто с помощью Authentication.user._id в качестве параметра для userId в вызове REST, я был в состоянии сделать это. Вот мой новый FriendsService:

function FriendsService($resource, Authentication) { 
    return $resource('api/:userId/friends/:friendId', { 
     userId: Authentication.user._id, 
     friendId: '@_id' 
    }, { 
     update: { 
      method: 'PUT' 
     } 
    }); 
} 
1

Вы должны делать, что проверка в основном в сервер.

Но в первую очередь: учитывая, что ваши друзья api похожи по структуре на пример статьи api, после того как запросы сделаны, вы должны проверить, какие конечные точки маршрута определены на стороне сервера, в основном в файле routes.js в /modules/friends/server/routes и в то же время сравнить, какие контроллеры будут обрабатывать логику на стороне сервера, которая должна быть расположена в /modules/friends/server/controllers.

Теперь, если вы внимательно посмотрите, есть строка в файле маршрутов:

// Finish by binding the article middleware 
app.param('articleId', articles.articleByID); 

Это отправная точка, чтобы решить вашу проблему, вы должны связать userId и friendId что-то вроде этого:

app.param('userId', friends.userByID); 
app.param('friendId', friends.friendByID); 

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

Это должен быть путь, а затем в контроллер для GET /api/:userId/friends, вы должны добавить необходимую логику, чтобы mongoose запрашивал только друзей для этого конкретного пользователя и возвращал их.

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

+0

Начальный раздел этого ответа, который я уже выполнил. Раздел, над которым я борюсь, - это то, где вы упоминаете: * «вам нужно добавить необходимую логику ...» *. Здесь я изо всех сил пытаюсь, поскольку, насколько я вижу, при запросе списка друзей, вызов '/ api /: userId/friends' ** должен быть ** сделан на стороне клиента службы друзей, но'/api/друзья - это вызов, который делается вместо этого. Я обновлю свой вопрос и поставлю вывод в свою консоль – wmash

2

Похоже, вы не прошли USERID к FriendsService, что причина, когда вы выполняете vm.friends = FriendsService.query(); запрос, /api/friends URL срабатывает. Вы должны изменить FriendsService, чтобы получить USERID в качестве входных данных

Вы можете написать свой завод как этого

app.factory('FriendsService', function ($resource) { 
return $resource('/:entity/:id/:action/:friendId', {id: '@id',friendId: '@friendId'}, { 
    firendsList: {method: 'PUT', params: {entity: 'api',action:'friends'}}, // this calls the api/userId/friends api in PUT method you can use friendId here too for understanding i seperated the service. 
    fetchFriend:{method:'GET',params:{entity:'api',action:'friends'}} // this calls the api/userId/friends/friendId in GET method 
}); 

Примечание: Вы можете сделать entity, action статичными, как api, `друг соответственно. Или можете сохранить его настраиваемым и использовать его для других методов.

Теперь в контроллере можно написать

function FriendsListController(FriendsService) { 

FriendsService.firendsList({'id': 'userId'}, function (response) { 
      alert('Edited successfully'); 
      console.log(response) 
     }, function (error) { 
      if (error) 
       alert(error) 
     }) 

FriendsService.fetchFriend({'id': 'userId',friendId:'friendId'}, function (response) { 
      alert('Friend Fetched successfully'); 
      console.log(response) 
     }, function (error) { 
      if (error) 
       alert(error) 
     }) 
} 
  1. Является ли моя логика правильная? В том смысле, что, когда пользователь выбирает просмотр списка друзей, запрашивается услуга?

Ответ: Когда пользователь выбирает для просмотра списка друзей он имеет friendsList службы должны быть названы.

  1. В службе params userId и friendId установлены на @user (который я установил) или @_id (который уже был там). Моя презумпция заключалась в том, что это поля в коллекции в монго, верно? В любом случае я могу отлаживать значения, которые передаются в этот вызов?

Ответ:userId и friendId не совсем поля в коллекциях MongoDB, эти переменные ресурсы, используемые для вызова службы API, The userId, friendId должны быть переданы в то время как вы называете эту услугу. Если эти параметры не пройдены, ресурс будет считать это пустым и вызовет API /api/friends, так как userId и friendId не определены.

  1. Где находится звонок /api/friends? Поскольку, логически в моей голове, я не могу найти, где он вызывается в клиенте (возможно, потому, что я недостаточно знаю MEAN.структура JS пока)

Ответ: Ответ в самом втором вопросе, если вы не передавайте значения для userId, угловой сервис опускает userId ключа в API URL, который в основном реструктурирует, как /api/friends

Надеюсь, это поможет.

+0

Я дал это щедрость, как вы предоставили прозрение, и ответил на все мои вопросы. Я не принял ответ как (хотя я уверен, что это сработает), это не так, как я об этом говорил. См. Мой ответ за то, как я это сделал – wmash

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

  • Нет связанных вопросов^_^