Node http createServer历程源码解读

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也就是传入的回调函数

    原文作者:小帆
    原文地址: https://segmentfault.com/a/1190000008504535
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞