19

OK、誰もが 200 が OK で 404 が見つからないことを知っています。しかし、永続的なリダイレクトと一時的なリダイレクト、または支払いが必要な場合、またはその他のよりエキゾチックな HTTP エラー コードのようなものについては、次のようなことを行う方がよい場合があります。

response.status('REQUEST_ENTITY_TOO_LARGE');

一般的に悪い習慣と考えられているマジックナンバーを使用するだけではありません。もちろん、一部のオブジェクトに 413:'REQUEST_ENTITY_TOO_LARGE' を含めることもできますが、Express には既にステータス コードのコピーがあります -> 名前マッピング。

Express JS で応答ステータスを名前で指定するにはどうすればよいですか?

編集:http.STATUS_CODESを指摘してくれた@Akshatに感謝します。値自体が一意であるため、彼の答えを詳しく説明すると、次のように実行できます。

   var statusCodeByName = {};
   for ( var number in http.STATUS_CODES ) {
     statusCodeByName[http.STATUS_CODES[number]] = number
   }

これにより、次のことが可能になります。

  > statusCodeByName['Request Entity Too Large']
  '413'
4

3 に答える 3

3

HTTP 応答コードはマジック ナンバーではありません。それらは仕様です。説明文は参考になるだけですが、プロトコル自体はこれらのステータス コードに依存しており、コア コードは学ぶ価値があります。二つの思い。ファイルの先頭に定数を作成して、これを行うことができます。

var REQUEST_ENTITY_TOO_LARGE = 413;
response.status(REQUEST_ENTITY_TOO_LARGE);

ただし、ほとんどの REST API は次の応答を実装するだけです。

200 - OK
201 - Created  # Response to successful POST or PUT
302 - Found # Temporary redirect such as to /login
303 - See Other # Redirect back to page after successful login
304 - Not Modified
400 - Bad Request
401 - Unauthorized  # Not logged in
403 - Forbidden  # Accessing another user's resource
404 - Not Found
500 - Internal Server Error

最後に、役に立つ場合に備えて、カスタム エラー ページをレンダリングするためのコードを共有します。

module.exports = function(app) {

  app.use(function(req, res) {
  // curl https://localhost:4000/notfound -vk
  // curl https://localhost:4000/notfound -vkH "Accept: application/json"
    res.status(404);

    if (req.accepts('html')) {
      res.render('error/404', { title:'404: Page not found', error: '404: Page not found', url: req.url });
      return;
    }

    if (req.accepts('json')) {
      res.send({ title: '404: Page not found', error: '404: Page not found', url: req.url });
    }
  });

  app.use( function(err, req, res, next) {
    // curl https://localhost:4000/error/403 -vk
    // curl https://localhost:4000/error/403 -vkH "Accept: application/json"
    var statusCode = err.status || 500;
    var statusText = '';
    var errorDetail = (process.env.NODE_ENV === 'production') ? 'Sorry about this error' : err.stack;

    switch (statusCode) {
    case 400:
      statusText = 'Bad Request';
      break;
    case 401:
      statusText = 'Unauthorized';
      break;
    case 403:
      statusText = 'Forbidden';
      break;
    case 500:
      statusText = 'Internal Server Error';
      break;
    }

    res.status(statusCode);

    if (process.env.NODE_ENV !== 'production' && process.env.NODE_ENV !== 'test') {
      console.log(errorDetail);
    }

    if (req.accepts('html')) {
      res.render('error/500', { title: statusCode + ': ' + statusText, error: errorDetail, url: req.url });
      return;
    }

    if (req.accepts('json')) {
      res.send({ title: statusCode + ': ' + statusText, error: errorDetail, url: req.url });
    }
  });
};
于 2013-08-19T12:59:30.997 に答える
1

ソース コードを自分で変更する意思がない限り、これは不可能です。の実装を見てみましょうres.send

引数として文字列を指定すると、それを html として解釈し、応答を 200 として送信します。

ExpressがHTTPステータスコードに数字を使用する理由は、ノード自体がhttp.STATUS_CODESのオブジェクトキーとして数字を使用しているためだと思います

于 2013-08-19T11:14:51.787 に答える