美文网首页
阅读源码的方式(以nodejs创建一个http服务为例)

阅读源码的方式(以nodejs创建一个http服务为例)

作者: Egde | 来源:发表于2017-12-09 16:41 被阅读0次

这些都是需要自己实际操作的,找人带是最好最快的方式(请不要根据我的解答来看源码,因为我写的肯定不准确)

为了阅读源码,我们需要线索,就是带问题查看源码。

下面涉及到的概念有流(Stream)、事件的监听及调用、还有继承关系


// 查看源码,看一个http服务是怎么实现的

const http = require('http')

// 源码地址可以从这看https://github.com/nodejs/node/blob/v8.x

// 问题0:createServer做了什么?

// 问题1:createServer里的回调函数什么时候执行?

// 问题2:回调函数里的参数req,res是什么,怎么生成的?

// 问题3:listen的时候干了什么?

http

.createServer(function(req, res) {

res.writeHead(200, {'Content-Type': 'text/plain'})

res.write('Hello NodeJs')

res.end()

})

.listen(2017)

下面就是对功能的总结,属于对代码的语言化吧,我感觉(实际情况不会这么棱角分明,是盘根错节的。所以需要掌握阅读源码的方法)

// 解答0:createServer创建了一个Server实例并把回调函数传到Server里了

// 解答1:在createServer创建时传入的函数被绑定到了request事件上,在触发request事件的时候会传两个参数req,res。request在parserOnIncoming函数里被触发

// 解答2:req,res生成会涉及到IncommingMessage,OutgoingMessage。

                res是ServerResponse的实例,req是传入的参数。ServerResponse是OutgoingMessage的子类。所以res也属于OutgoingMessage的实例。再挖掘,发现OutgoingMessage是继承自Stream

                req是parserOnIncoming函数传入的参数,慢慢挖会到IncommingMessage,req是它的实例

// 解答3:这里我比较迷,感觉有一个断层。parserOnIncoming是在connectionListener中被定义的。connectionListener是connection的监听函数。connection事件被触发的时间(这里就感觉不连续了)。在net.js模块中会找到connection被触发的代码self.emit('connection', socket),此代码在onconnection函数里onconnection函数在setupListenHandle里执行Server.prototype._listen2=setupListenHandle;再往上找_listen2方法在Server的原型上(Server.prototype.listen)里执行

HttpServer继承自net(其实我并不清楚是这关系)所以http实例可以使用listen(),listen方法被调用后,上面(解答3)流程就触发了

相关文章

网友评论

      本文标题:阅读源码的方式(以nodejs创建一个http服务为例)

      本文链接:https://www.haomeiwen.com/subject/llauixtx.html