js

记一次nodejs源码bug分析

js

记一次nodejs源码bug分析

1. 问题 前几日,我在测试express框架的时候,构造了一个测试样例死活过不来,即便调试到测试框架superagent ,依然不对。最终发现是nodejs的bug,而且最新版本的nodejs已经"修复"了,导致我中间饶了几圈都没发现是nodejs的事,下面来重现问题流程。 2. 环境预备 1. 安装一下gnvm 地址,后面需要控制一下版本(windows10 需要用管理员权限的cmd或者powershell) 2. 安装git环境(主要要使用curl命令) 3. 摘抄如下代码 // main.js var http = require('http') var tmpObject = Object tmpObject.prototype['love'] = 'express' var server = http.

By chainhelen

内存泄漏

记一次定位js内存泄漏

来源 线上有个升级服务,隔一两个月时间内存会慢慢上涨到服务器内存80%以上,单进程内存到500M左右 原因一直不明确 heapdump 首先压测无果,初步猜测应该是压测量级或者特殊情况触发不够 就想着添加一下代码,等出现情况时,dump线上进程的内存 添加heapdump库,准备随时dump内存,但是由于内存过大,不能设置定时器,否则很可能影响性能 所以采用添加在路由里,等到情况复现时,手动触发 var heapdump = require('heapdump'); ... router.get('/profiler', function(req, res, next) { let query = req.query // 做token验证 if('xxxxxxxxxxxxx' === query.token) { heapdump.writeSnapshot(path.join(

By chainhelen

js

js 匿名函数 箭头函数

关于new 首先回顾一下new关键字 var ch = new Fa(); 等价于 var ch = {}; ch.__prototype__ = Fa.prototype; Fa.call(ch); 本质上call的第一个参数可以理解传入了一个this,改变了整个上下文 本文事例 运行环境 nodejs v7.7.2 拿一段观察者模式的代码来看 //js文件 function Event() { this.handlers = {}; } Event.prototype.on = function(type, cb) { //exception handler, need to code if("undefined" == typeof this.handlers[type]) { this.

By chainhelen

js

js valueOf

toString的区别 valueOf():返回最适合该对象类型的原始值; toString(): 将该对象的原始值以字符串形式返回。 在数值运算里,会优先调用valueOf(),如a + b; 在字符串运算里,会优先调用toString(),如alert(c)。 知乎来源 我在网上找到的其他例子,放在crhome里面跑,或者nodejsV7.7.2都是不同的 所以有理由相信,之前的js实现跟当前流行的是不一样的,下面以nodejs为主 var c = { i: 10, valueOf: function () { console.log("valueOf --->") return this.i + 30; }, toString: function () { console.log("toString --->") return this.i + 10;

By chainhelen

js

express.js 源码四探 —— application篇

本篇 本篇是这个系列的第四篇,谢谢各位的建议 环境 保持与之前的版本一致,源码版本是express.js 4.14.1 application源码 app.init 戳这里,初始化app的一些参数 //导出的是这个app实例 var app = exports = module.exports = {}; //这个后面再讨论,关于代理 var trustProxyDefaultSymbol = '@@symbol:trust_proxy_default'; //cache、engines、settings属性设置为空对象 app.init = function init() { this.cache = {}; this.engines = {}; this.settings = {}; //运行下面的默认配置函数 this.defaultConfiguration(); }; app.defaultConfiguration 一

By chainhelen
express.js 源码三探 —— response篇

js

express.js 源码三探 —— response篇

本篇 本篇是这个系列的第三篇,谢谢各位的建议 环境 保持与之前的版本一致,源码版本是express.js 4.14.1 response源码 Object.create 打开response.js,从上往下看代码,代码具体戳这里 var res = module.exports = { __proto__: http.ServerResponse.prototype }; 上一篇我们讲到request对象和http.IncomingMessage的关系,那么类似的response和ServerResponse也是一样的 但是注意最新的express代码中已经不用这个,采用Object.create(),看最新的代码 var res = Object.create(http.ServerResponse.prototype) Object.create是E5中提出的一种新的对象创建方式,本质上也是把res.__proto__指向ServerResponse.prototype res.status res.status = f

By chainhelen

js

express.js 源码二探 —— request篇

接上篇初探 上篇写的很乱,只是个人临时决定写的。主要试图从app.use和app.[method]之间区别着手,来解释express的中间件和路由的实现逻辑。 本篇 本篇很有可能依然保持上篇的发散性思维,所以各位读者可能要小心阅读,避免吐槽而亡。 环境 保持与上篇一致,源码版本是express.js 4.14.1 request源码 打开request.js,从上往下看代码 IncomingMessage var req = exports = module.exports = { __proto__: http.IncomingMessage.prototype }; 代码具体戳这里 我们要导出request这个对象,跟http.IncomingMessage有什么关系,而且是挂在request的__proto__原型链上 我们知道nodejs提供的原生http对象通常是这么用的 var http = require('http'); http.createServer( (function(

By chainhelen