私はNodejsで遊んでいて、小さいrest APIを作ることによって表現しています。私の質問は、コードのステータスとレスポンスデータを設定するための良い方法/最良の方法は何ですか?
ちょっとしたコードで説明しましょう(関係するルーターメソッドだけで、サーバーを起動するために必要なノードとコードを記述しません)。
router.get('/users/:id', function(req, res, next) {
var user = users.getUserById(req.params.id);
res.json(user);
});
exports.getUserById = function(id) {
for (var i = 0; i < users.length; i++) {
if (users[i].id == id) return users[i];
}
};
以下のコードは完璧に動作します。Postmanでリクエストを送信すると、次のようになります。
ご覧のとおり、ステータスは200と表示されています。これは問題ありません。しかし、これはこれを行うための最良の方法ですか?返されたJSONだけでなく、自分自身でステータスを設定する必要がある場合がありますか?それとも、常にexpressによって処理されますか。
たとえば、私は簡単なテストを行い、上記のgetメソッドをわずかに変更しました。
router.get('/users/:id', function(req, res, next) {
var user = users.getUserById(req.params.id);
if (user == null || user == 'undefined') {
res.status(404);
}
res.json(user);
});
ご覧のとおり、ユーザーが配列内に見つからない場合は、ステータスを404に設定します。
このトピックについてもっと学ぶためのリソース/アドバイスは大歓迎です。
あなたはこのようにそれをすることができます:
res.status(400).json(json_response);
これはHTTPステータスコードを400に設定します、それはエクスプレス4でも動作します。
res.send
、res.json
などを使用する場合は、ステータス200がデフォルトになります。
res.status(500).json({ error: 'something is wrong' });
のようにステータスを設定できます
しばしば私は以下のようなことをします...
router.get('/something', function(req, res, next) {
// Some stuff here
if(err) {
res.status(500);
return next(err);
}
// More stuff here
});
それから私のエラーミドルウェアに応答を送ってもらい、エラーがあったときに私がする必要がある他のことをしなさい。
さらに:res.sendStatus(status)
はバージョン4.9.0http://expressjs.com/4x/api.html#res.sendStatusから追加されました
ステータスレスポンスに関するグッドプラクティスは、予想通り、エラーに応じて適切なHTTPステータスコード(クライアントエラーの場合は4xx、サーバーエラーの場合は5xx)を送信することです。成功したレスポンスでステータスとデータをルートオブジェクトの2つの異なるプロパティとして(再度)送信する(この方法で、HTTPヘッダとからステータスを取得する機会をクライアントに与えますペイロード自体)とエラーの場合には人間が理解できる方法でエラーを説明する3番目のプロパティ。
Stripeの APIは、実世界でも同様に動作します。
すなわち.
OK
200, {status: 200, data: [...]}
エラー
400, {status: 400, data: null, message: "You must send foo and bar to baz..."}
Express.jsアプリケーションでこれを使用しています。
app.get('/', function (req, res) {
res.status(200).json({
message: 'Welcome to the project-name api'
});
});
res.status(500).jsonp(dataRes);
以下のプロパティを含む完全なHttpResponseを取得する標準的な方法
バックエンドでこれを行います
router.post('/signup', (req, res, next) => {
// res object have its own statusMessage property so utilize this
res.statusMessage = 'Your have signed-up succesfully'
return res.status(200).send('You are doing a great job')
})
あなたが受け取りたい場合Angular
アプリでは、次のようにします。
this.http.post(`http://example.com/signup`, { profile: data }, {
observe: 'response' // remember to add this, you'll get pure HttpResponse
}).subscribe(response => {
console.log(response)
})
try {
var data = {foo: "bar"};
res.json(JSON.stringify(data));
}
catch (e) {
res.status(500).json(JSON.stringify(e));
}