国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Node http createServer過程源碼解讀

seal_de / 2811人閱讀

摘要:在函數中,觸發了事件。的來源的來源來自的形參而來自的。在方法中在里調用中有對方法的調用,也就是說,當調用,會出發,進一步觸發,發出和,觸發也就是傳入的回調函數

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也就是傳入的回調函數

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/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元查看
<