私は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()})
});
});
すべてのアイデアをいただければ幸いです。事前
おっと! :)その欠落しているパラメータを見ていなかった。これは欠けているデータを処理しました。しかし、saveToken(サービスでも宣言されている)メソッドは定義されていません。これはおそらく私がコールバックの中にいるためで、 'this'はもうサービスを参照していないからです。サーバーからlocalstorageに返されるトークンを保存する必要があります(これはsaveTokenの機能です)。これを行う方法に関する推奨事項。 – hrivera
@hriveraこれは、関数内のthisはあなたが考えているものではないからです。私は[この記事を読む]ことを強くお勧めします(http://javascriptissexy.com/understand-javascripts-this-with-明快でマスターなit /) –
ありがとう、それを調べる – hrivera