Express.JS:如何按名称而不是数字设置响应状态?

时间:2013-08-19 10:45:59

标签: node.js http express http-status-codes magic-numbers

好的,大家都知道200没问题,找不到404。但是对于永久与临时重定向或需要付款或其他更奇特的HTTP错误代码之类的东西,最好做一些类似的事情:

response.status('REQUEST_ENTITY_TOO_LARGE');

而不仅仅是使用通常被认为是不好的魔术数字。当然,我可以在某个对象中有413:'REQUEST_ENTITY_TOO_LARGE',但Express已经有一份状态代码 - >名字映射,我宁愿不重复。

如何在Express JS中按名称指定响应状态?

编辑:感谢@Akshat指出http.STATUS_CODES。详细说明他的答案,因为价值观本身是独一无二的,所以可以运行:

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

允许一个人:

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

3 个答案:

答案 0 :(得分:10)

只有一个节点模块用于此目的:http-status-codes。

https://www.npmjs.org/package/http-status-codes

以下是文档说的内容:

<强>安装

npm install http-status-codes

<强>用法

var HttpStatus = require('http-status-codes');

response.send(HttpStatus.OK);
response.send(
    HttpStatus.INTERNAL_SERVER_ERROR, 
    { error: HttpStatus.getStatusText(HttpStatus.INTERNAL_SERVER_ERROR) }
);

答案 1 :(得分: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 });
    }
  });
};

答案 2 :(得分:1)

除非您愿意自己更改源代码,否则这是不可能的。请查看res.send

implementation

如果你提供一个字符串作为参数,它只是将它解释为html并将响应发送为200.

我认为express表示使用HTTP状态代码的原因是因为节点本身使用数字作为http.STATUS_CODES的对象键