node的入门就会写如许几行简朴的代码,而createServer的历程终究发作什么
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 `);
});
题目1:request和response是什么
首先在http.js代码中
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
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’事宜的监听器。
在resOnFinish函数中,self.emit('request', req, res);
触发了request事宜。
res的泉源
var res = new ServerResponse(req);
req的泉源
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
题目2:什么时候实行回调函数
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也就是传入的回调函数