#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
это не aconsole.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-адрес, потому что это abad request
(вот что означает ошибка 400)5. протестируйте каждую часть вашей системы отдельно. Сначала протестируйте свой серверный сервер, используя Postman или чистый curl из CLI. Как только ваш серверный сервер ответит на все ваши запросы (GET, POST, PUT, DELETE), приступайте к отладке вашего интерфейса