成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Node http createServer過程源碼解讀

seal_de / 2810人閱讀

摘要:在函數(shù)中,觸發(fā)了事件。的來源的來源來自的形參而來自的。在方法中在里調(diào)用中有對方法的調(diào)用,也就是說,當(dāng)調(diào)用,會出發(fā),進一步觸發(fā),發(fā)出和,觸發(fā)也就是傳入的回調(diào)函數(shù)

node的入門就會寫這樣幾行簡單的代碼,而createServer的過程究竟發(fā)生什么

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的實例,傳入回調(diào)函數(shù),并返回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"事件的監(jiān)聽器。

在resOnFinish函數(shù)中,self.emit("request", req, res);觸發(fā)了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:什么時候執(zhí)行回調(diào)函數(shù)

connectionListener中有parser.onIncoming = parserOnIncoming.bind(undefined, this, socket, state);

在server的初始化時

this.on("request", requestListener);注冊request時加上執(zhí)行回調(diào)操作

this.on("connection", connectionListener);注冊connection的Listener

parserOnIncoming方法中 server.emit("request", req, res);發(fā)出request;最后在parserOnHeadersComplete方法中調(diào)用onIncoming,也就是server里的parserOnIncoming

那么什么時候會發(fā)出connection操作呢?

在net.js中的onconnection方法中self.emit("connection", socket);

_listen2方法中this._handle.onconnection = onconnection;

在listen里調(diào)用listen2self._listen2(address, port, addressType, backlog, fd);

Server.prototype.listen = function() 中有對listen方法的調(diào)用,也就是說,當(dāng)server調(diào)用listen,會出發(fā)connectionListener,進一步觸發(fā)parserOnIncoming,發(fā)出request和response,觸發(fā)requestListener也就是傳入的回調(diào)函數(shù)

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/88148.html

相關(guān)文章

  • 解讀express 4.x源碼(1)

    摘要:在后續(xù)的總結(jié)中,我會繼續(xù)分析,并準(zhǔn)備將一些值得分析的逐一解讀,也會涉及一些。從一個官方示例開始這是官方給出的一個簡單程序,運行后訪問顯示。第一行載入了框架,我們來看源代碼中的。代碼的開始定義了一個函數(shù),函數(shù)有形參,,為回調(diào)函數(shù)。 這兩天仔細看了看express的源碼,對其的整個實現(xiàn)有了較清晰的認識,所以想總結(jié)一下寫出來,如果有什么不對的地方,望指出。 這是第一篇,首先介紹一個最簡單的...

    summerpxy 評論0 收藏0
  • Koa源碼閱讀筆記(3) -- 服務(wù)器の啟動與請求處理

    摘要:本筆記共四篇源碼閱讀筆記源碼閱讀筆記源碼閱讀筆記服務(wù)器啟動與請求處理源碼閱讀筆記對象起因前兩天閱讀了的基礎(chǔ),和中間件的基礎(chǔ)。的前端樂園原文鏈接源碼閱讀筆記服務(wù)器啟動與請求處理 本筆記共四篇Koa源碼閱讀筆記(1) -- coKoa源碼閱讀筆記(2) -- composeKoa源碼閱讀筆記(3) -- 服務(wù)器の啟動與請求處理Koa源碼閱讀筆記(4) -- ctx對象 起因 前兩天閱讀了K...

    mrcode 評論0 收藏0
  • express4.0源碼解析

    摘要:就是每一個教程里面開始教學(xué)的事例,啟動服務(wù)器的回調(diào)函數(shù)。,從入口開始分析源碼首先是把模塊的屬性全部進里面去,在把事件的屬性全部進里面去,這是為了給增加事件功能。 express4.X源碼解讀第一天 express4.X 跟3.X 有很大區(qū)別,4.X 去除了connect的依賴,3.X基于connect的中間件基本全部不能用,如果還有可以使用的,也是4.X重寫的。所以要想繼續(xù)使用這些熟悉...

    paraller 評論0 收藏0
  • Node.js 系列:原生 Node.js 應(yīng)用

    摘要:原生應(yīng)用是一個基于引擎的運行環(huán)境使用了一個事件驅(qū)動非阻塞式的模型,使其輕量又高效的包管理器,是全球最大的開源庫生態(tài)系統(tǒng)本文主要介紹構(gòu)建一個應(yīng)用的基本步驟和模塊,并假定你已經(jīng)對有一定的了解本文引用部分代碼作為例子,如果希望參看全部源碼,歡迎去 原生 Node.js 應(yīng)用 Node.js 是一個基于 Chrome V8 引擎的 JavaScript 運行環(huán)境Node.js 使用了一個事件驅(qū)...

    Ocean 評論0 收藏0
  • Node.js child_process模塊解讀

    摘要:而且方式創(chuàng)建的子進程與父進程之間建立了通信管道,因此子進程和父進程之間可以通過的方式發(fā)送消息。與事件的回調(diào)函數(shù)有兩個參數(shù)和,代碼子進程最終的退出碼,如果子進程是由于接收到信號終止的話,會記錄子進程接受的值。 在介紹child_process模塊之前,先來看一個下面的代碼。 const http = require(http); const longComputation = () =>...

    baiy 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<