平均堆栈。解释客户端控制器如何通过路由与服务器控制器通信以及如何调用服务器方法

时间:2016-10-03 15:00:46

标签: javascript express stack mean

我正在开发一个平均堆栈应用程序,并且无法向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方法?我的控制台没有打印"在DeleteCard"消息,我不知道出了什么问题(根据我的理解,客户端控制器使用路由来确定调用API后在服务器端调用哪些方法。如果我没有提供足够的信息,请告诉我。提前谢谢!

1 个答案:

答案 0 :(得分:0)

您必须发出" DELETE"请求您的客户。好像你正在使用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)
            })
        }
    }]);