2016-11-22 7 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-明快でマスターなit /) –

+0

ありがとう、それを調べる – hrivera