摘要:在函數(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
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
摘要:在后續(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)單的...
摘要:本筆記共四篇源碼閱讀筆記源碼閱讀筆記源碼閱讀筆記服務(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...
摘要:就是每一個(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ù)使用這些熟悉...
摘要:原生應(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ū)...
摘要:而且方式創(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 = () =>...
閱讀 2950·2021-11-23 09:51
閱讀 3776·2021-11-22 15:29
閱讀 3226·2021-10-08 10:05
閱讀 1552·2021-09-22 15:20
閱讀 952·2019-08-30 15:56
閱讀 1069·2019-08-30 15:54
閱讀 733·2019-08-26 11:54
閱讀 2636·2019-08-26 11:32