2015-10-08 3 views
0

В приложении 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 и может обновить без проблем. Я в тупике, и, надеюсь, кто-то выведет меня из моих страданий.

+0

Почему вы используете функцию get и put. Вы можете просто передать идентификатор пользователя, чтобы поместить запрос и обновить данные, используя findByIdAndUpdate –

+0

Если я удалю функцию get, я получаю «TypeError: Не могу назначить только имя свойства« только для чтения », когда что-либо вводится в форме редактирования. – meanstacky

+0

Также изменение findById для findByIdAndUpdate в put помещает способность Postman обновляться через api. – meanstacky

ответ

0

Мне пришлось сменить этот вариант. Тот факт, что вручную введенный user_id в работе Postman работал, должен был сказать мне, что user_id, предоставленный угловым кодом, неверен. Таким образом, я убедился, что JWT включал user_id:

var token = jwt.sign({ 
       name: user.name, 
       email: user.email, 
       user_id: user._id 

Затем добавили апи конечную точку, чтобы получить информацию о пользователе:

apiRouter.get('/me', function(req, res) { 
     res.send(req.decoded); 
    }); 

Затем подключили услугу:

userFactory.get = function() { 
     return $http.get('/api/me/'); 
    }; 

Тогда в контроллер Я мог бы позвонить:

User.get() 
    .success(function(result) { 
    $scope.user_id = result.user_id; 
    }); 

$ scope.user_id теперь имеет правильный user_id, которые я могу передать в метод обновления:

User.update($scope.user_id, vm.userData) 
     .success(function(data) 

Так что теперь он работает, как предполагалось.

Смежные вопросы