Mean Stack. Объясните, как клиентский контроллер взаимодействует с серверным контроллером через маршруты и как вызывать серверные методы

#javascript #express #stack #mean

#javascript #выразить #стек #mean

Вопрос:

Я работаю над приложением mean stack и у меня возникли проблемы с отправкой запросов на сервер Express / Node для удаления элемента массива в Mongo.Вот моя схема..

 var DeckSchema = new Schema({
  name: {
    type: String,
    default: '',
    required: 'Please fill Deck name',
    trim: true
  },
  card: [{
    name: { 
      type: String, default: '', 
      trim: true,
      required: 'Please fill Card name'
    },...
  

Вот мой маршрут на стороне клиента, который я создал

 .state('decks.card', {
        url: '/:deckId/card/:cardId',
        templateUrl: 'modules/decks/client/views/view-card.client.view.html',
        controller: 'DecksController',
        controllerAs: 'vm',
        resolve: {
          deckResolve: getDeck,
          cardResolve: getCard
        },...



function getDeck($stateParams, DecksService) {
    return DecksService.get({
      deckId: $stateParams.deckId
    }).$promise;
  }
  function getCard($stateParams, RemoveCardService) {
    return RemoveCardService.get({
      deckId: $stateParams.deckId,
      cardId: $stateParams.cardId
    }).$promise;
  

Вот маршруты на стороне сервера

 app.route('/api/decks/:deckId/card/:cardId').all()
    .get(decks.read)
    .put(decks.update)
    .delete(decks.deleteCard);

  // Finish by binding the Deck middleware
  app.param('deckId', decks.deckByID);
  //app.param('cardId', decks.cardByID); This causes errors
  

серверный контроллер

  exports.deleteCard = function(req, res) {

    res.send('In deleteCard');
    Deck.update(
        {'_id': req.body.deck_.id}, 
        { $pull: { "card" : { id: req.body.deck.card._id } } },
    false,
    true 
    );
      //decks.update( {id: req.params.deckId}, { $pullAll: {id: [req.params.cardId] } } )
    };
  

и промежуточное программное обеспечение…

 exports.cardByID = function(req, res, next, id){

    if (!mongoose.Types.ObjectId.isValid(id)) {
    return res.status(400).send({
      message: 'Card is invalid'
    });
  }
      Deck.findById(id).populate('card','user', 'displayName').exec(function (err, deck) {
    if (err) {
      return next(err);
    } else if (!deck) {
      return res.status(404).send({
        message: 'No Card with that identifier has been found'
      });
    }
    req.deck.card = deck.card;
    next();
  });
};
  

Как мне вызвать метод deleteCard в клиентском контроллере? Моя консоль не печатает сообщение «In DeleteCard», и я не могу понять, что не так (насколько я понимаю, клиентский контроллер использует маршруты, чтобы определить, какие методы вызывать на стороне сервера после вызова API. Если я не предоставил достаточной информации, пожалуйста, дайте мне знать. Заранее спасибо!

Комментарии:

1. res.send это не a console.log , res.send просто отправит что-то клиенту. Я не помню, но я не уверен, что остальная часть вашей функции выполняется (я имею в виду после res.send)

Ответ №1:

Вы должны отправить запрос «УДАЛИТЬ» от вашего клиента. Похоже, вы используете Angular. Так почему бы не использовать $http?

 $http({
    method: "DELETE",
    url: '/api/decks/111/card/222'
})
  

У DecksController вас должно быть что-то вроде этого

 angular.module('myapp')
    .controller('DecksController', ['$scope', '$http',  function ($scope, $http) {
        $scope.deleteCard = function (deckId, cardId) {
            $http({
                method: "DELETE",
                url: '/api/decks/' deckId '/card/' cardId
            })
            .then(function (resp) {
                console.log('response from server', resp)
            })
        }
    }]);
  

Комментарии:

1. У меня есть сервис, который использует ngresource для выполнения этого в модуле deck, но я не включил его в исходный пост. Это для api /api/decks/:deckId/card/:CardID. Клиент использует сервис для связи с правильными маршрутами?

2. Вы можете свободно вызывать api из контроллера или службы, angular позволяет это, но да, лучше всего иметь свою бизнес-логику и состояние в службе, и это включает в себя вызовы API.

3. angular.js:9893 УДАЛИТЬ localhost:3000/api / decks / card?id= 57ef14e4058951ec0dbd24e9 400 (Неверный запрос) — это ошибка, которую я получаю. Идентификатор deckId отсутствует, что это означает?

4. вызванный вами URL-адрес не имеет a deckId , поэтому ваш сервер не смог обработать URL-адрес, потому что это a bad request (вот что означает ошибка 400)

5. протестируйте каждую часть вашей системы отдельно. Сначала протестируйте свой серверный сервер, используя Postman или чистый curl из CLI. Как только ваш серверный сервер ответит на все ваши запросы (GET, POST, PUT, DELETE), приступайте к отладке вашего интерфейса