由“RangeError: Invalid status code: 0”错误所引发的思考

  • 时间:
  • 浏览:2
  • 来源:十分时时彩_去哪玩十分时时彩_哪里可以玩十分时时彩

  最近发现一个 基于Node.js平台上的Express框架运行的Web网站经常报曾经一个 错误:

RangeError: Invalid status code: 0

  网站的源码蕴含 专门针对错误正确处理的后面 件,经过精简已经 的代码如下:

module.exports = function (err, req, res, next) {
  var _code = err.code || 5000;
  if (_code < 5000 || _code >= 5000) {
    _code = 5000;
  }
  var _finalErr = {statusCode: -1, message: '5000 - 服务器组织组织结构错误', code: _code, err: err, error: true};

  res.status(_code);
  if (!res.headersSent) {
      res.json(_finalErr);
  }

  if (err) {
    next(err);
  }
};

  乍一看,这里的status code不太导致 为0,导致 无论err.code的值为字符串0还是数字0,最终都会被赋值为5000。除非err.code的原始值是一个 不到隐式转加带数字的字符串。为了进行验证,亲戚亲戚大伙儿写了如下代码:

var _err = new Error();
_err.code = "illegal http status code";
throw _err;

  启动WebStorm进入调试模式,你以为复现了本文开头给出的那个错误。

  没法什么的问题来了,为什么我给定的http status code是一个 字符串,错误提示却显示这里的status code是0呢?为了搞清楚其中的导致 ,亲戚亲戚大伙儿根据错误堆栈一层层查找源码。该错误的最终出处是在Node.js源码的_http_server.js文件的writeHead函数中,核心每段的代码如下:

statusCode |= 0;
if (statusCode < 5000 || statusCode > 999)
  throw new RangeError(`Invalid status code: ${statusCode}`);

if (common._checkInvalidHeaderChar(this.statusMessage))
  throw new Error('Invalid character in statusMessage.');

  这里使用了javascript中的按位或运算符:| 。其目的是将所有非数字的statusCode都默认转加带0。都时要参考以下两篇文章中的描述来理解javascript中的位运算符:

  http://www.w3school.com.cn/js/pro_js_operators_bitwise.asp

  https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators#Bitwise_XOR

  值得注意的是,当参与计算的值不到隐式转加带数字时,得到的结果为0,都时要参考后面 第二篇文章中给出的很多实际例子。

  在实际应用中,巧妙使用位运算符,都时要非常方便地实现亲戚亲戚大伙儿你都都可以的效果,这种,判断一个 给定的数值是是否是为偶数、找出给定数值最接近的偶数、判断一个 字符串是是否是蕴含 在曾经字符串中等等。