摘要:比如,大塊編碼的消息。這些接口不緩沖完整的請求或響應,用戶能夠以流的形式處理數據。它只涉及流處理與消息解析。結構圖由于該模塊中的內容比較多,圖片我就分開傳了,避免一張圖密密麻麻的。請求遇到問題寫入數據到請求主體
環境:Node v8.2.1; Npm v5.3.0; OS Windows10
客戶端、服務端對我們都不陌生,Node.js 中的 HTTP 接口被設計成支持協議的許多特性。 比如,大塊編碼的消息。 這些接口不緩沖完整的請求或響應,用戶能夠以流的形式處理數據。
為了支持各種可能的 HTTP 應用,Node.js 的 HTTP API 是非常底層的。 它只涉及流處理與消息解析。 它把一個消息解析成消息頭和消息主體,但不解析具體的消息頭或消息主體。
1、API結構圖由于該模塊中的內容比較多,圖片我就分開傳了,避免一張圖密密麻麻的。
1.1 模塊類結構圖 1.2 Agent類結構圖 1.3 ClientRequest類結構圖 1.4 Server 類結構 1.5 ServerResponse類結構圖 1.6 IncomingMessage類結構圖 1.7 靜態方法和屬性圖 2、類關系在看API之前,我還是簡單的縷一縷上面幾個類的關系吧,從一個簡單的例子開始
2.1 簡單且核心的例子const http = require("http"); //server const server = http.createServer((clientReq,serverRes)=>{ serverRes.end(); }).listen(3000) //client const client=http.get("http://localhost:3000",(clientRes)=>{ })
上面那么簡單的幾行代碼已經成功創建了一個server和一個client,看似簡單,實際上卻不這樣,上面代碼以一共創建了4個實例,可以對照著頂部的那張圖看。
server:http.Server 類的實例,用來提供服務,處理客戶端的請求。
client:http.ClientRequest 類的實例,用于向服務端發起請求
clientReq/clientRes:http.IncomingMessage 類的實例,【clientReq】用于服務端獲取客戶端請求的信息,【clientRes】用于客戶端獲取服務端返回的相關消息
serverRes:http.ServerResponse 類實例,用于服務端響應客戶端請求
2.2 類關系圖圖片有點亂,在畫圖本里面拖出來的,講究看吧,下面貼出繼承關系的源碼,只貼框架,里面具體的內容就不貼了,貼出來感覺蠻亂的。
http.IncomingMessage 類繼承 stream.Readable:
export class IncomingMessage extends stream.Readable {}
http.ServerResponse 類繼承stream.Writable:
export class OutgoingMessage extends stream.Writable {} export class ServerResponse extends OutgoingMessage {}3、一些例子
下面是部分API的例子,對部分API的一個簡單代碼實現
3.1 server屬性const http = require("http"); const server=http.createServer((ClientRequest,ServerResponse)=>{ ServerResponse.end(); }) server.listen(3000); console.log("listening: "+server.listening); console.log("maxHeadersCount: "+server.maxHeadersCount); console.log("timeout: "+server.timeout); console.log("keepAliveTimeout: "+server.keepAliveTimeout); // listening: true // maxHeadersCount: null (沒有限制) // timeout: 120000 // keepAliveTimeout: 50003.2 server事件
const http = require("http"); const server = http.createServer((ClientRequest, ServerResponse) => { ServerResponse.end(); }).listen(3000); server.on("request", (request, response) => { console.log("服務端收到請求"); }) server.on("connection",socket=>{ //超過默認的5000msTCP流會被關閉,再次請求時會被重新建立 console.log("一個新的 TCP 流被建立"); })3.3 serverResponse屬性
const http = require("http"); const server = http.createServer((ClientRequest, ServerResponse) => { ServerResponse.writeHead(200, { "Content-Type": "text/plain"}); ServerResponse.write("hello world"); console.log("connection: "+ServerResponse.connection); console.log("finished: "+ServerResponse.finished); console.log("headersSent: "+ServerResponse.headersSent); console.log("sendDate: "+ServerResponse.sendDate); console.log("socket: "+ServerResponse.socket); console.log("statusCode: "+ServerResponse.statusCode); console.log("statusMessage: "+ServerResponse.statusMessage); ServerResponse.end(); console.log("finished: "+ServerResponse.finished); }).listen(3000); /* connection: [object Object] finished: false headersSent: true sendDate: true socket: [object Object] statusCode: 200 statusMessage: OK finished: true */3.4 addTrailers()
const http = require("http"); const server = http.createServer((ClientRequest, ServerResponse) => { ServerResponse.writeHead(200, { "Content-Type": "text/plain" }); ServerResponse.write("hello world"); ServerResponse.addTrailers({"Content-MD5": "7895bf4b8828b55ceaf47747b4bca667"}) ServerResponse.end(); }).listen(3000);3.5 getHeader()
const http = require("http"); const server = http.createServer((ClientRequest, ServerResponse) => { ServerResponse.setHeader("foo","bar"); ServerResponse.writeHead(200, { "Content-Type": "text/plain" }); ServerResponse.write("hello world"); console.log(ServerResponse.getHeader("foo")); ServerResponse.end(); }).listen(3000);3.6 getHeaderNames()
const http = require("http"); const server = http.createServer((ClientRequest, ServerResponse) => { ServerResponse.setHeader("foo","bar"); ServerResponse.writeHead(200, { "Content-Type": "text/plain" }); ServerResponse.write("hello world"); console.log(ServerResponse.getHeaderNames()); //[ "foo", "content-type" ] ServerResponse.end(); }).listen(3000);3.7 get()
const http = require("http"); const ClientRequest = http.get("http://localhost:3000", res => { res.setEncoding("utf8") let rawData = ""; res.on("data", chunk => { rawData += chunk; }) res.on("end", () => { console.log(rawData); }) }) ClientRequest.on("response", (imsg) => { console.log("收到響應"); })3.8 http.request
摘一個官方例子^_^
const postData = querystring.stringify({ "msg" : "Hello World!" }); const options = { hostname: "www.google.com", port: 80, path: "/upload", method: "POST", headers: { "Content-Type": "application/x-www-form-urlencoded", "Content-Length": Buffer.byteLength(postData) } }; const req = http.request(options, (res) => { console.log(`狀態碼: ${res.statusCode}`); console.log(`響應頭: ${JSON.stringify(res.headers)}`); res.setEncoding("utf8"); res.on("data", (chunk) => { console.log(`響應主體: ${chunk}`); }); res.on("end", () => { console.log("響應中已無數據。"); }); }); req.on("error", (e) => { console.error(`請求遇到問題: ${e.message}`); }); // 寫入數據到請求主體 req.write(postData); req.end();
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/88796.html
摘要:例如指定一些依賴到模塊中實現規范的模塊化,感興趣的可以查看的文檔。 CommonJS 定義了 module、exports 和 require 模塊規范,Node.js 為了實現這個簡單的標準,從底層 C/C++ 內建模塊到 JavaScript 核心模塊,從路徑分析、文件定位到編譯執行,經歷了一系列復雜的過程。簡單的了解 Node 模塊的原理,有利于我們重新認識基于 Node 搭建的...
摘要:概述本文主要介紹了我對的一些核心特性的理解,包括架構特點機制核心模塊與簡單應用。在此期間,主線程繼續執行其他任務。延續了瀏覽器端單線程,只用一個主線程執行,不斷循環遍歷事件隊列,執行事件。 原文地址在我的博客,轉載請注明來源,謝謝! node是在前端領域經常看到的詞。node對于前端的重要性已經不言而喻,掌握node也是作為合格的前端工程師一項基本功了。知道node、知道后端的一些東西...
摘要:深入淺出一直想致力于寫一篇關于廣義講解系統的文章,苦于時間有限,資源有限。事件驅動機制是通過內部單線程高效率地維護事件循環隊列來實現的,沒有多線程的資源占用和上下文的切換。 深入淺出Node.js 一直想致力于寫一篇關于廣義講解Node.js系統的文章,苦于時間有限,資源有限。這篇文章是在結合自己的學習心得以及與行業大佬共同探討下爭對于熟練掌握JS語言后的廣義Node.js.至于為什么...
摘要:深入淺出一直想致力于寫一篇關于廣義講解系統的文章,苦于時間有限,資源有限。事件驅動機制是通過內部單線程高效率地維護事件循環隊列來實現的,沒有多線程的資源占用和上下文的切換。 深入淺出Node.js 一直想致力于寫一篇關于廣義講解Node.js系統的文章,苦于時間有限,資源有限。這篇文章是在結合自己的學習心得以及與行業大佬共同探討下爭對于熟練掌握JS語言后的廣義Node.js.至于為什么...
摘要:深入淺出一直想致力于寫一篇關于廣義講解系統的文章,苦于時間有限,資源有限。事件驅動機制是通過內部單線程高效率地維護事件循環隊列來實現的,沒有多線程的資源占用和上下文的切換。 深入淺出Node.js 一直想致力于寫一篇關于廣義講解Node.js系統的文章,苦于時間有限,資源有限。這篇文章是在結合自己的學習心得以及與行業大佬共同探討下爭對于熟練掌握JS語言后的廣義Node.js.至于為什么...
閱讀 2577·2021-11-22 13:53
閱讀 4085·2021-09-28 09:47
閱讀 871·2021-09-22 15:33
閱讀 820·2020-12-03 17:17
閱讀 3321·2019-08-30 13:13
閱讀 2126·2019-08-29 16:09
閱讀 1183·2019-08-29 12:24
閱讀 2455·2019-08-28 18:14