nodejsとexpressで作成されたREST APIで応答ステータスとJSONコンテンツを設定する適切な方法


186

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に設定します。

このトピックの詳細を学ぶためのリソース/アドバイスは大歓迎です。


3
これは私の最高の定格答えは、それが受け入れられていない:( @dukable、私はそれはしばらくしている知っているが、それはあなたの問題を解決しましたか?
のMichałDudak

@MichałDudak:はい、あなたの答えは受け入れられるものでなければなりません。ただし、この書き込み可能なユーザーは、2015年10月15日以降はアクティブではありません(2017年7月31日現在)。とにかく答えに+1);)
Amol M Kulkarni 2017

回答:


230

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

ステータス確認して送信してください。

つまり、またはをstatus呼び出す前にメソッドを呼び出すjson必要がありsendます。

res.status(500).send({ error: "boo:(" });

32
ステータスコード(データなし)のみを送信する場合、メソッドは次のようになりますres.sendStatus(400);
internet-nico

3
これはもう機能しないようです。応答が正しいステータスコードと共に送信されるが、全く体ない....
LondonRob

2
最後のコメントは無視してください。ステータスを204(コンテンツなし)に設定すると、本文は送信されません。
LondonRob 2018年

2
@ internet-nico res.sendStatus(400);も文字列データを送信します。これは次と同等ですres.status(400).send('Not Found')
Davide

74

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

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

これにより、HTTPステータスコードが400に設定され、Express 4でも機能します。


17
express deprecated res.json(status, obj): Use res.status(status).json(obj) instead それで、res.status(400).json(json_response)今日は正確でしょう。
Will Luce

はい、ありがとうございます。非推奨としてマークされていますが、引き続き機能します。Pコメントは有効です。
mzalazar 2016


41

使用する際に200の状態がデフォルトになりますres.sendres.jsonなど

次のようにステータスを設定できます 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.0の 時点で追加されましたhttp://expressjs.com/4x/api.html#res.sendStatus


23

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

ステータス応答に関する推奨事項は、予測どおり、エラーに応じて適切なHTTPステータスコード(クライアントエラーの場合は4xx、サーバーエラーの場合は5xx)を送信することです。実際のJSON応答に関しては、「聖書」はありませんが、成功した応答でルートオブジェクトの2つの異なるプロパティとして(再び)ステータスとデータを送信する(これにより、クライアントはHTTPヘッダーペイロード自体からステータスをキャプチャする機会が与えられます)と、エラーの場合、人間が理解できる方法でエラー。

Stripeの APIは、現実の世界でも同様に動作します。

すなわち

OK

200, {status: 200, data: [...]}

エラー

400, {status: 400, data: null, message: "You must send foo and bar to baz..."}

13

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

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

5

以下のプロパティを含む完全な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.statusText = 'Your have signed-up succesfully'
    return res.status(200).send('You are doing a great job')
})

上のフロントエンドなどでAngular、単に実行します。

let url = `http://example.com/signup`
this.http.post(url, { profile: data }, {
    observe: 'response' // remember to add this, you'll get pure HttpResponse
}).subscribe(response => {
    console.log(response)
})


2
try {
  var data = {foo: "bar"};
  res.json(JSON.stringify(data));
}
catch (e) {
  res.status(500).json(JSON.stringify(e));
}

0

あなたはこれを行うことができます

            return res.status(201).json({
                statusCode: req.statusCode,
                method: req.method,
                message: 'Question has been added'
            });

0

エラー応答を送信する最良の方法はreturn res.status(400).send({ message: 'An error has occurred' })です。

次に、フロントエンドで、次のようなものを使用してそれをキャッチできます。

        url: your_url,
        method: 'POST',
        headers: headers,
        data: JSON.stringify(body),
    })
        .then((res) => {
            console.log('success', res);
        })
        .catch((err) => {
            err.response && err.response.data && this.setState({ apiResponse: err.response.data })
        })

err送信したメッセージオブジェクトはに存在するため、ログを記録するだけでは機能しませんerr.response.data

お役に立てば幸いです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.