资讯专栏INFORMATION COLUMN

Node http createServer过程源码解读

seal_de / 2707人阅读

摘要:在函数中,触发了事件。的来源的来源来自的形参而来自的。在方法中在里调用中有对方法的调用,也就是说,当调用,会出发,进一步触发,发出和,触发也就是传入的回调函数

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
");
});

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://www.ucloud.cn/yun/88148.html

相关文章

  • 解读express 4.x源码(1)

    摘要:在后续的总结中,我会继续分析,并准备将一些值得分析的逐一解读,也会涉及一些。从一个官方示例开始这是官方给出的一个简单程序,运行后访问显示。第一行载入了框架,我们来看源代码中的。代码的开始定义了一个函数,函数有形参,,为回调函数。 这两天仔细看了看express的源码,对其的整个实现有了较清晰的认识,所以想总结一下写出来,如果有什么不对的地方,望指出。 这是第一篇,首先介绍一个最简单的...

    summerpxy 评论0 收藏0
  • Koa源码阅读笔记(3) -- 服务器の启动与请求处理

    摘要:本笔记共四篇源码阅读笔记源码阅读笔记源码阅读笔记服务器启动与请求处理源码阅读笔记对象起因前两天阅读了的基础,和中间件的基础。的前端乐园原文链接源码阅读笔记服务器启动与请求处理 本笔记共四篇Koa源码阅读笔记(1) -- coKoa源码阅读笔记(2) -- composeKoa源码阅读笔记(3) -- 服务器の启动与请求处理Koa源码阅读笔记(4) -- ctx对象 起因 前两天阅读了K...

    mrcode 评论0 收藏0
  • express4.0源码解析

    摘要:就是每一个教程里面开始教学的事例,启动服务器的回调函数。,从入口开始分析源码首先是把模块的属性全部进里面去,在把事件的属性全部进里面去,这是为了给增加事件功能。 express4.X源码解读第一天 express4.X 跟3.X 有很大区别,4.X 去除了connect的依赖,3.X基于connect的中间件基本全部不能用,如果还有可以使用的,也是4.X重写的。所以要想继续使用这些熟悉...

    paraller 评论0 收藏0
  • Node.js 系列:原生 Node.js 应用

    摘要:原生应用是一个基于引擎的运行环境使用了一个事件驱动非阻塞式的模型,使其轻量又高效的包管理器,是全球最大的开源库生态系统本文主要介绍构建一个应用的基本步骤和模块,并假定你已经对有一定的了解本文引用部分代码作为例子,如果希望参看全部源码,欢迎去 原生 Node.js 应用 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境Node.js 使用了一个事件驱...

    Ocean 评论0 收藏0
  • Node.js child_process模块解读

    摘要:而且方式创建的子进程与父进程之间建立了通信管道,因此子进程和父进程之间可以通过的方式发送消息。与事件的回调函数有两个参数和,代码子进程最终的退出码,如果子进程是由于接收到信号终止的话,会记录子进程接受的值。 在介绍child_process模块之前,先来看一个下面的代码。 const http = require(http); const longComputation = () =>...

    baiy 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<