我正在开发一个平均堆栈应用程序,并且无法向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后在服务器端调用哪些方法。如果我没有提供足够的信息,请告诉我。提前谢谢!
答案 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)
})
}
}]);