2016-10-03 63 views
0

我正在研究一个平均堆栈应用程序,并且无法向Express/Node服务器发送请求以删除Mongo中的一个数组元素。这里是我的模式..Mean Stack。解释客户端控制器如何通过路由与服务器控制器进行通信以及如何调用服务器方法

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后,如果我有没有得到足够的信息,请让我知道。在此先感谢!

+0

'res.send'不是'console.log',res.send只会发送一些东西给客户端。我不remoder,但我不知道你的函数的其余部分是执行(我的意思是res.send后) –

回答

0

你必须发出从客户端“删除”请求。好像你正在使用角度。那么,为什么不使用$ 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) 
      }) 
     } 
    }]); 
+0

我有一个服务,使用ngresource来完成这个甲板模块,但我没有包括它在原始帖子。它为api/api/deck /:deckId/card /:cardId。客户端使用该服务与路由正确通信? – user6831918

+0

您可以自由地从控制器或服务调用api,angular允许这样做,但是,最好是在服务中拥有业务逻辑和状态,并且包含API调用。 – JorgeObregon

+0

angular.js:9893 DELETE http:// localhost:3000/api/decks/card?id = 57ef14e4058951ec0dbd24e9 400(错误请求)是我正在获取的错误。 deckId不存在,这是什么意思? – user6831918