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

資訊專欄INFORMATION COLUMN

Node http createServer過程源碼解讀

seal_de / 2804人閱讀

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

node的入門就會(huì)寫這樣幾行簡(jiǎn)單的代碼,而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做的事情很簡(jiǎn)單,只是new一個(gè)Server的實(shí)例,傳入回調(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的實(shí)例

IncomingMessage = require("_http_incoming").IncomingMessage;
_http_incoming中可以看到util.inherits(IncomingMessage, Stream.Readable);所以IncomingMessage是繼承自Stream.Readable

問題2:什么時(shí)候執(zhí)行回調(diào)函數(shù)

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

在server的初始化時(shí)

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

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

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

那么什么時(shí)候會(huì)發(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() 中有對(duì)listen方法的調(diào)用,也就是說,當(dāng)server調(diào)用listen,會(huì)出發(fā)connectionListener,進(jìn)一步觸發(fā)parserOnIncoming,發(fā)出request和response,觸發(fā)requestListener也就是傳入的回調(diào)函數(shù)

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/88148.html

相關(guān)文章

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

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

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

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

    mrcode 評(píng)論0 收藏0
  • express4.0源碼解析

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

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

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

    Ocean 評(píng)論0 收藏0
  • Node.js child_process模塊解讀

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

    baiy 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<