В приложении MEAN я пытаюсь разрешить авторизованному пользователю (адрес электронной почты и пароль) изменять свое имя пользователя. Я могу с успехом использовать Postman для создания нового имени пользователя до http://localhost:3000/api/users/xxxxxxxxxxxxxxxx. Но угловой код не работает. Вот соответствующая часть страницы редактирования:Углубленный вызов API в приложении MEAN
<form ng-submit="user.saveUser()">
<div class="form-group">
<label> New Username</label>
<input type="text" class="form-control" ng-model="user.userData.name">
</div>
Вот контроллер:
.controller('userEditController', function($routeParams, User) {
var vm = this;
vm.type = 'edit';
User.get($routeParams.user_id)
.success(function(data) {
vm.userData = data;
});
// function to save the user
vm.saveUser = function() {
vm.processing = true;
vm.message = '';
// call the userService function to update
User.update($routeParams.user_id, vm.userData)
.success(function(data) {
vm.processing = false;
// clear the form
vm.userData = {};
// bind the message from our API to vm.message
vm.message = data.message;
});
};
});
Здесь служба:
// update a user
userFactory.update = function(id, userData) {
return $http.put('/api/users/' + id, userData);
};
в этой точке USERDATA содержит имя: «Fred» или что-то еще, что было введено для формы
и здесь является api.js
apiRouter.route('/users/:user_id')
// get the user with that id
.get(function(req, res) {
User.findByIdAndUpdate(req.params.user_id, function(err, user) {
if (err) return res.send(err);
// return that user
res.json(user);
});
})
// update the user with this id
.put(function(req, res) {
console.error(req.params.user_id);
User.findById(req.params.user_id, function(err, user) {
if (err) return res.send(err);
// set the new user information if it exists in the request
if (req.body.name) user.name = req.body.name;
// save the user
user.save(function(err) {
if (err) return res.send(err);
// return a message
res.json({ message: 'User updated!' });
});
});
});
(я должен был использовать findByIdAndUpdate вместо findById из-за CastError.)
Хотя консольных состояний:
XHR завершения загрузки: PUT HTTP :/localhost/3000/api/users/user_id
Значение req.params.user_id равно user_id.
Терминал показывает:
PUT/API/пользователей/user_id 200 4,040 мс - 2273
GET/API/пользователей/идентификатор_пользователя - - мс - -
GET/API/пользователей/user_id - - мс - -
GET/API/пользователей/user_id - - мс - -
Как я говорю Почтальон может обмениваться данными с API и может обновить без проблем. Я в тупике, и, надеюсь, кто-то выведет меня из моих страданий.
Почему вы используете функцию get и put. Вы можете просто передать идентификатор пользователя, чтобы поместить запрос и обновить данные, используя findByIdAndUpdate –
Если я удалю функцию get, я получаю «TypeError: Не могу назначить только имя свойства« только для чтения », когда что-либо вводится в форме редактирования. – meanstacky
Также изменение findById для findByIdAndUpdate в put помещает способность Postman обновляться через api. – meanstacky