由“RangeError: Invalid status code: 0”错误所引发的思考
最近发现一个基于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
值得注意的是,当参与计算的值不能隐式转换成数字时,得到的结果为0,可以参考上面第二篇文章中给出的一些实际例子。
在实际应用中,巧妙使用位运算符,可以非常方便地实现我们想要的效果,例如,判断一个给定的数值是否为偶数、找出给定数值最接近的偶数、判断一个字符串是否包含在另一个字符串中等等。
由“RangeError: Invalid status code: 0”错误所引发的思考的更多相关文章
- java.io.StreamCorruptedException: invalid type code: AC错误的解决方法
问题描述: 在向一个文件写入可序列化对象时,每次只想向文件的末尾添加一个可序列化的对象,于是使用了FileOutputStream(文件名,true)间接的构建了ObjectOutputStream流 ...
- 一次composer错误使用引发的思考
一次composer错误使用引发的思考 这个思考源自于一个事故.让我对版本依赖重新思考了一下. 事故现象 一个线上的管理后台,一个使用laravel搭建的管理后台,之前在线上跑的好好的,今天comop ...
- (转)Genymotion安装virtual device的“unable to create virtual device, Server returned Http status code 0”的解决方法
网络原因无法下载virtual device,status 为0表示服务器没有响应.FQ下载吧,有VPN的小伙伴推荐这种. 或者直接手动下载ova虚拟机文件,然后将虚拟机文件导入到virtualbox ...
- Genymotion加入模拟器时报“Unable to create virtual device,Server returned HTTP status code 0”
今天也遇到这个问题,算是对这个文章的一点补充 打开图中这个文件 C:\Users\xxx\AppData\Local\Genymobile 搜索 [downloadFile] 找到这个一串URL ht ...
- genymotion下载出现Unable to create virtual device,Server returned HTTP status code 0.
解决方法:
- android模拟器 一个错误:X Error of failed request: BadRequest (invalid request code or no such operation)
最近ubuntu12.04学习python,python2.7 python3.2所不同的是还是蛮大的.学习思考的新 升级后 结果显示 输入方法不显示 update-manager 和 add- ...
- Js 跨域CORS报错 Response for preflight has invalid HTTP status code 405
问题 公司项目H5调用接口遇到Response for preflight has invalid HTTP status code 405这样的错误,是使用PUT方式提交请求接口.Content-T ...
- HTTP 1.0 Status Code Definitions
part of Hypertext Transfer Protocol -- HTTP/1.1RFC 2616 Fielding, et al. 10 Status Code Definitions ...
- 转 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 ...
随机推荐
- virtualenv 在windows下的简单应用
https://docs.python.org/zh-cn/3/tutorial/venv.html cmd下的操作: pip install virtualenv pip install virt ...
- 利用python实现dll依赖关系导出
#说明:遍历rootdir目录下所有dll,导出每个dll依赖的dll信息到dstdir目录下 # 配合NotePad++打开所有txt,搜索,可快速定位到某dll被依赖的所有dll文件 import ...
- 为什么说 Java 中只有值传递?
对于初学者来说,要想把这个问题回答正确,是比较难的.在第二天整理答案的时候,我发现我竟然无法通过简单的语言把这个事情描述的很容易理解,遗憾的是,我也没有在网上找到哪篇文章可以把这个事情讲解的通俗易懂. ...
- AQS系列(二)- ReentrantLock的释放锁
前言 在AQS系列(一)中我们一起看了ReentrantLock加锁的过程,今天我们看释放锁,看看老Lea那冷峻的思维是如何在代码中笔走龙蛇的. 正文 追踪unlock方法: public void ...
- MyBatis之MyBatis Generator逆向工程
官网地址 http://mybatis.org/generator/ 下载地址 http://central.maven.org/maven2/org/mybatis/generator/mybati ...
- HDU-6113
度度熊是一个喜欢计算机的孩子,在计算机的世界中,所有事物实际上都只由0和1组成. 现在给你一个n*m的图像,你需要分辨他究竟是0,还是1,或者两者均不是. 图像0的定义:存在1字符且1字符只能是由一个 ...
- 把JSON转换成键值对
public static Dictionary<string, string> JsonStringToKeyValuePairs(string jsonStr) { char json ...
- win7再分配磁盘新加卷
磁盘在系统刚分区的时候可以做磁盘分区最好 1.右键我的电脑,选在管理 2.在此窗口下依次展开选项,点击存储->磁盘管理,右边是我已经分好的盘不用看的 3.确认一下我的电脑的各个盘的空间,选择要压 ...
- 解决老浏览器不支持ES6的方法
转载地址:http://www.rockyxia.com/?p=669 为什么ES6会有兼容性问题? 由于广大用户使用的浏览器版本在发布的时候也许早于ES6的定稿和发布,而到了今天,我们在编程中如果使 ...
- 关于HPS和FPGA之间的桥接学习笔记一
为了实现FPGA和HPS之间的存储器共享和数据传输,Altera SoC FPGA提供了两种方式用于FPGA和HPS通信.分别是FPGA to SDRAM和AXI bridge. FPGA to SD ...