2016-11-22 4 views
1

MEAN을 시작으로 작은 프로젝트를 진행하고 있습니다. 나는 thinkster.io에 대한 튜토리얼을 따라 왔으며 (지금까지 약간의 수정이 있었음) 좋은 결과를 얻었습니다. Postman에서 API 경로를 테스트했는데 모든 것이 작동합니다. 문제는 어떤 이유로 (NodeJS를 처음 접했을뿐), Content-type : x-www-form-urlencoded가있는 요청 만 허용합니다.

여러 번 나왔던 해결책은 $ 리소스의 options 매개 변수에서 헤더를 변경하는 것입니다. 이것은 내가 가지고있는 코드입니다

register: function(user){ 

     var deferred = $q.defer(); 
     var UserResource = $resource('/api/users/register', {}, { 
      save: { 
       method: 'POST', 
       headers: { 
        'Content-Type': 'application/x-www-form-urlencoded' 
       }, 
       transformRequest: function (data, headersGetter) { 
        console.log(data); // data is undefined ?? 
        var str = []; 
        for (var d in data) 
         str.push(encodeURIComponent(d) + "=" + encodeURIComponent(data[d])); 

        return str.join("&"); 
       } 
      } 
     }); 

     UserResource.save(function(user){ 
      this.saveToken(user.token); 
      deferred.resolve(user); 
     }, function(user){    
      deferred.reject(user); 
     }); 
     return deferred.promise; 
} 

레지스터 기능은 각도 서비스에서 선언되었습니다. 문제는 req.body 객체가 비어 있기 때문에 백엔드가 나에게 오류를 보내고 있다는 것입니다. 이는 transformRequest 메소드가 올바르게 실행되지 않기 때문입니다. 약간의 디버깅을하면 'data'매개 변수가 정의되지 않은 것으로 나타났습니다. 이것은 백엔드의 코드입니다.

router.post('/register', function(req, res, next){   
    if(!req.body.username || !req.body.password){ 
     console.log(req.body.username); 
     return res.status(400).json({message: 'Por favor llene todos los campos'}); 
    } 

    var user = new User(); 

    user.username = req.body.username; 

    user.fullname = req.body.fullname; 

    user.setPassword(req.body.password); 

    user.save(function (err){ 
     if(err){ return next(err); } 

     return res.json({token: user.generateJWT()}) 
    }); 
}); 

모든 아이디어를 얻을 수 있습니다. 사전

답변

1

감사 당신은, 당신이 거기에 배치 할 수 있습니다 후 save 방법 (즉 요청 body을 통과하게된다)의 첫번째 매개 변수에 user 데이터를 전달해야 successCallback & errorCallback

UserResource.save(user, function(user){ 
    this.saveToken(user.token); 
    deferred.resolve(user); 
}, function(user){    
    deferred.reject(user); 
}); 

체크 아웃 this article

+0

아차! :) 빠진 매개 변수를 보지 못했습니다. 이것은 누락 된 데이터를 처리했습니다. 그러나 이제 saveToken (서비스에서도 선언 된) 메소드가 정의되지 않은 상태로 던지고 있습니다. 이것은 아마도 콜백 내부에 있고 'this'를 사용하여 더 이상 서비스를 참조하지 않기 때문일 수 있습니다. 서버에서 localstorage로 반환되는 토큰을 저장해야합니다 (saveToken이 수행하는 것입니다). 이 작업을 수행하는 방법에 대한 권장 사항. – hrivera

+0

@hrivera 왜냐하면 함수 안에있는 'this'가 당신이 생각하고있는 것이 아니기 때문입니다. 나는 [이 기사] (http://javascriptissexy.com/understand-javascripts-this-with- 선명도 및 마스터 - 그것 /) –

+0

고마워, 그것에 들여다 것입니다 – hrivera

관련 문제