node的入门就会写这样几行简单的代码,而createServer的过程究竟发生什么node
const http = require('http'); const server = http.createServer((req, res) => { res.statusCode = 200; res.setHeader('Content-Type', 'text/plain'); res.end('Hello World\n'); }); server.listen(() => { console.log(`Server is running `); });
首先在http.js代码中socket
const Server = exports.Server = server.Server; exports.createServer = function(requestListener) { return new Server(requestListener); };
createServer作的事情很简单,只是new一个Server的实例,传入回调函数,并返回server函数
const server = require('_http_server');
能够看到server来自_http_server
ui
function Server(requestListener) { if (!(this instanceof Server)) return new Server(requestListener); net.Server.call(this, { allowHalfOpen: true }); if (requestListener) { this.addListener('request', requestListener); } this.httpAllowHalfOpen = false; this.addListener('connection', connectionListener); this.timeout = 2 * 60 * 1000; this._pendingResponseData = 0; } util.inherits(Server, net.Server); Server.prototype.setTimeout = function(msecs, callback) { this.timeout = msecs; if (callback) this.on('timeout', callback); return this; }; exports.Server = Server;
Server继承net.Server,且requestListener,做为'request'事件的监听器。this
在resOnFinish函数中,self.emit('request', req, res);
触发了request事件。prototype
res的来源 var res = new ServerResponse(req);
code
req的来源server
req来自parserOnIncoming的形参;parser.onIncoming = parserOnIncoming.bind(undefined, this, socket, state);
而parser来自_http_common
的parsers.alloc()。继承
在方法parserOnHeadersComplete中skipBody = parser.onIncoming(parser.incoming, shouldKeepAlive);
传入了request,parser.incoming = new IncomingMessage(parser.socket);
说明传入的request是IncomingMessage的实例事件
IncomingMessage = require('_http_incoming').IncomingMessage;
_http_incoming
中能够看到util.inherits(IncomingMessage, Stream.Readable);
因此IncomingMessage是继承自Stream.Readable
connectionListener中有parser.onIncoming = parserOnIncoming.bind(undefined, this, socket, state);
在server的初始化时
this.on('request', requestListener);
注册request时加上执行回调操做
this.on('connection', connectionListener);
注册connection的Listener
parserOnIncoming方法中 server.emit('request', req, res);
发出request;最后在parserOnHeadersComplete方法中调用onIncoming,也就是server里的parserOnIncoming
那么何时会发出connection操做呢?
在net.js中的onconnection方法中self.emit('connection', socket);
。
在_listen2
方法中this._handle.onconnection = onconnection;
在listen里调用listen2self._listen2(address, port, addressType, backlog, fd);
Server.prototype.listen = function()
中有对listen方法的调用,也就是说,当server调用listen,会出发connectionListener,进一步触发parserOnIncoming,发出request和response,触发requestListener也就是传入的回调函数