web-dev-qa-db-ja.com

nodejsとexpressで作成されたREST AP​​IでレスポンスステータスとJSONコンテンツを設定する適切な方法

私は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でリクエストを送信すると、次のようになります。 enter image description here

ご覧のとおり、ステータスは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に設定します。

このトピックについてもっと学ぶためのリソース/アドバイスは大歓迎です。

142
dukable

Express APIリファレンスはこのケースをカバーしています。

ステータス および 送信 を参照してください。

要するに、statusまたはjsonを呼び出す前にsendメソッドを呼び出すだけです。

res.status(500).send({ error: "boo:(" });
181
Michał Dudak

あなたはこのようにそれをすることができます:

res.status(400).json(json_response);

これはHTTPステータスコードを400に設定します、それはエクスプレス4でも動作します。

61
mzalazar

res.sendres.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から追加されました

35
Jordonias

HTTPステータスコードのリスト

ステータスレスポンスに関するグッドプラクティスは、予想通り、エラーに応じて適切な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..."}
17
cmlndz

Express.jsアプリケーションでこれを使用しています。

app.get('/', function (req, res) {
    res.status(200).json({
        message: 'Welcome to the project-name api'
    });
});
13
mrks
res.status(500).jsonp(dataRes);
3

以下のプロパティを含む完全なHttpResponseを取得する標準的な方法

  1. body //データを含みます
  2. ヘッダー
  3. oK
  4. 状態
  5. statusText
  6. タイプ
  7. uRL

バックエンドでこれを行います

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)
})
2
WasiF
try {
  var data = {foo: "bar"};
  res.json(JSON.stringify(data));
}
catch (e) {
  res.status(500).json(JSON.stringify(e));
}
1
Sma Ma