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

RangeError: Invalid status code: 

  网站的源码中有专门针对错误处理的中间件,经过精简之后的代码如下:

module.exports = function (err, req, res, next) {
var _code = err.code || 500;
if (_code < 100 || _code >= 600) {
_code = 500;
}
var _finalErr = {statusCode: -1, message: '500 - 服务器内部错误', 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,最终都会被赋值为500。除非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 < 100 || 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,可以参考上面第二篇文章中给出的一些实际例子。

  在实际应用中,巧妙使用位运算符,可以非常方便地实现我们想要的效果,例如,判断一个给定的数值是否为偶数、找出给定数值最接近的偶数、判断一个字符串是否包含在另一个字符串中等等。

由“RangeError: Invalid status code: 0”错误所引发的思考的更多相关文章

  1. java.io.StreamCorruptedException: invalid type code: AC错误的解决方法

    问题描述: 在向一个文件写入可序列化对象时,每次只想向文件的末尾添加一个可序列化的对象,于是使用了FileOutputStream(文件名,true)间接的构建了ObjectOutputStream流 ...

  2. 一次composer错误使用引发的思考

    一次composer错误使用引发的思考 这个思考源自于一个事故.让我对版本依赖重新思考了一下. 事故现象 一个线上的管理后台,一个使用laravel搭建的管理后台,之前在线上跑的好好的,今天comop ...

  3. (转)Genymotion安装virtual device的“unable to create virtual device, Server returned Http status code 0”的解决方法

    网络原因无法下载virtual device,status 为0表示服务器没有响应.FQ下载吧,有VPN的小伙伴推荐这种. 或者直接手动下载ova虚拟机文件,然后将虚拟机文件导入到virtualbox ...

  4. Genymotion加入模拟器时报“Unable to create virtual device,Server returned HTTP status code 0”

    今天也遇到这个问题,算是对这个文章的一点补充 打开图中这个文件 C:\Users\xxx\AppData\Local\Genymobile 搜索 [downloadFile] 找到这个一串URL ht ...

  5. genymotion下载出现Unable to create virtual device,Server returned HTTP status code 0.

    解决方法:

  6. android模拟器 一个错误:X Error of failed request: BadRequest (invalid request code or no such operation)

    最近ubuntu12.04学习python,python2.7 python3.2所不同的是还是蛮大的.学习思考的新 升级后 结果显示 输入方法不显示   update-manager 和  add- ...

  7. Js 跨域CORS报错 Response for preflight has invalid HTTP status code 405

    问题 公司项目H5调用接口遇到Response for preflight has invalid HTTP status code 405这样的错误,是使用PUT方式提交请求接口.Content-T ...

  8. HTTP 1.0 Status Code Definitions

    part of Hypertext Transfer Protocol -- HTTP/1.1RFC 2616 Fielding, et al. 10 Status Code Definitions ...

  9. 转 Js 跨域CORS报错 Response for preflight has invalid HTTP status code 405

    转自:http://www.cnblogs.com/SilenceTom/p/6697484.html 调用接口遇到Response for preflight has invalid HTTP st ...

随机推荐

  1. Swoole高效跟传统的web开发有什么区别?

    一.swoole的运行模式 Swoole高效跟传统的web开发有什么区别,除了传统的LAMP/LNMP同步开发模式,swoole的异步开发模式是怎么样的. 1.1.传统web开发模式 PHP web开 ...

  2. 设计模式GOF23(创建型模式)

    • 创建型模式:  单例模式.工厂模式.抽象工厂模式.建造者模式.原型模式.   • 结构型模式: –适配器模式.桥接模式.装饰模式.组合模式.外观模式.享元模式.代理模式.   • 行为型模式: 模 ...

  3. C# 导出pdf(浏览器不预览直接下载)

    一.接口部分的代码 [HttpGet] public HttpResponseMessage ExportPdf(string id) { string pdfName = ""; ...

  4. django----多对多三种创建方式 form组件

    目录 多对多三种创建方式 全自动 全手动 半自动 form组件 基本使用 form_obj 及 is_valid() 前端渲染方式 取消前端自动校验 正则校验 钩子函数(Hook方法) cleaned ...

  5. Django 之day02,必会知识点

    静态文件配置******* 为什么用户在浏览器中输入的网址能够访问到对应的资源, 前提是后端提前开设该资源的访问,在urls.py文件中进行配置该路由, 如果我的后端没有开设相关的资源,用户是无法访问 ...

  6. 【程序人生】一个IT人的立功,立言,立德三不朽

    最近几个月很忙,忙着当奶爸,忙着做加班狗,忙着补裤裆学技术……以至于快忘了要思考人生了! 古人立志穷极一生追求“立德”,“立功”,“立言”,以求不朽,为万世所景仰,为后人所传颂,实现人生的意义.立德者 ...

  7. java基础- 你真的了解运算符吗?

    一 前言 学习java运算符的基础是你对数学和计算机原理有一定的要求,如果文章中有些位运算不懂是生么意思,我建议大家去学习一下计算机原理,计算机组成类别的书籍,你也不用深入过多,只要了解计算机大概结构 ...

  8. C# 几种常见数据结构

    一.内存上连续存储,节约空间,可以索引访问,读取快,增删慢 Array:在内存上连续分配的,而且元素类型是一样的,可以坐标访问;读取快--增删慢,长度不变 { //Array:在内存上连续分配的,而且 ...

  9. C# List集合 GroupBy分组

    var grpBalance = listBalance.GroupBy(m => new { m.MerChantId, m.Name}).Distinct().Select(t => ...

  10. Oracle Proc编程性能优化经验

    Proc 是Oracle提供的一种数据库操作的API.它是基于ESql技术的,需要预编译后才可以变成普通c代码,非常不直观,使用起来不太方便,阅读也存在困难. 因为这些问题导致程序员平时开发中会出现一 ...