摘要:比如,大塊編碼的消息。這些接口不緩沖完整的請求或響應(yīng),用戶能夠以流的形式處理數(shù)據(jù)。它只涉及流處理與消息解析。結(jié)構(gòu)圖由于該模塊中的內(nèi)容比較多,圖片我就分開傳了,避免一張圖密密麻麻的。請求遇到問題寫入數(shù)據(jù)到請求主體
環(huán)境:Node v8.2.1; Npm v5.3.0; OS Windows10
客戶端、服務(wù)端對我們都不陌生,Node.js 中的 HTTP 接口被設(shè)計成支持協(xié)議的許多特性。 比如,大塊編碼的消息。 這些接口不緩沖完整的請求或響應(yīng),用戶能夠以流的形式處理數(shù)據(jù)。
為了支持各種可能的 HTTP 應(yīng)用,Node.js 的 HTTP API 是非常底層的。 它只涉及流處理與消息解析。 它把一個消息解析成消息頭和消息主體,但不解析具體的消息頭或消息主體。
1、API結(jié)構(gòu)圖由于該模塊中的內(nèi)容比較多,圖片我就分開傳了,避免一張圖密密麻麻的。
1.1 模塊類結(jié)構(gòu)圖 1.2 Agent類結(jié)構(gòu)圖 1.3 ClientRequest類結(jié)構(gòu)圖 1.4 Server 類結(jié)構(gòu) 1.5 ServerResponse類結(jié)構(gòu)圖 1.6 IncomingMessage類結(jié)構(gòu)圖 1.7 靜態(tài)方法和屬性圖 2、類關(guān)系在看API之前,我還是簡單的縷一縷上面幾個類的關(guān)系吧,從一個簡單的例子開始
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)=>{ })
上面那么簡單的幾行代碼已經(jīng)成功創(chuàng)建了一個server和一個client,看似簡單,實際上卻不這樣,上面代碼以一共創(chuàng)建了4個實例,可以對照著頂部的那張圖看。
server:http.Server 類的實例,用來提供服務(wù),處理客戶端的請求。
client:http.ClientRequest 類的實例,用于向服務(wù)端發(fā)起請求
clientReq/clientRes:http.IncomingMessage 類的實例,【clientReq】用于服務(wù)端獲取客戶端請求的信息,【clientRes】用于客戶端獲取服務(wù)端返回的相關(guān)消息
serverRes:http.ServerResponse 類實例,用于服務(wù)端響應(yīng)客戶端請求
2.2 類關(guān)系圖圖片有點亂,在畫圖本里面拖出來的,講究看吧,下面貼出繼承關(guān)系的源碼,只貼框架,里面具體的內(nèi)容就不貼了,貼出來感覺蠻亂的。
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的一個簡單代碼實現(xiàn)
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("服務(wù)端收到請求"); }) server.on("connection",socket=>{ //超過默認的5000msTCP流會被關(guān)閉,再次請求時會被重新建立 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("收到響應(yīng)"); })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(`狀態(tài)碼: ${res.statusCode}`); console.log(`響應(yīng)頭: ${JSON.stringify(res.headers)}`); res.setEncoding("utf8"); res.on("data", (chunk) => { console.log(`響應(yīng)主體: ${chunk}`); }); res.on("end", () => { console.log("響應(yīng)中已無數(shù)據(jù)。"); }); }); req.on("error", (e) => { console.error(`請求遇到問題: ${e.message}`); }); // 寫入數(shù)據(jù)到請求主體 req.write(postData); req.end();
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/88796.html
摘要:例如指定一些依賴到模塊中實現(xiàn)規(guī)范的模塊化,感興趣的可以查看的文檔。 CommonJS 定義了 module、exports 和 require 模塊規(guī)范,Node.js 為了實現(xiàn)這個簡單的標準,從底層 C/C++ 內(nèi)建模塊到 JavaScript 核心模塊,從路徑分析、文件定位到編譯執(zhí)行,經(jīng)歷了一系列復(fù)雜的過程。簡單的了解 Node 模塊的原理,有利于我們重新認識基于 Node 搭建的...
摘要:概述本文主要介紹了我對的一些核心特性的理解,包括架構(gòu)特點機制核心模塊與簡單應(yīng)用。在此期間,主線程繼續(xù)執(zhí)行其他任務(wù)。延續(xù)了瀏覽器端單線程,只用一個主線程執(zhí)行,不斷循環(huán)遍歷事件隊列,執(zhí)行事件。 原文地址在我的博客,轉(zhuǎn)載請注明來源,謝謝! node是在前端領(lǐng)域經(jīng)常看到的詞。node對于前端的重要性已經(jīng)不言而喻,掌握node也是作為合格的前端工程師一項基本功了。知道node、知道后端的一些東西...
摘要:深入淺出一直想致力于寫一篇關(guān)于廣義講解系統(tǒng)的文章,苦于時間有限,資源有限。事件驅(qū)動機制是通過內(nèi)部單線程高效率地維護事件循環(huán)隊列來實現(xiàn)的,沒有多線程的資源占用和上下文的切換。 深入淺出Node.js 一直想致力于寫一篇關(guān)于廣義講解Node.js系統(tǒng)的文章,苦于時間有限,資源有限。這篇文章是在結(jié)合自己的學(xué)習(xí)心得以及與行業(yè)大佬共同探討下爭對于熟練掌握JS語言后的廣義Node.js.至于為什么...
摘要:深入淺出一直想致力于寫一篇關(guān)于廣義講解系統(tǒng)的文章,苦于時間有限,資源有限。事件驅(qū)動機制是通過內(nèi)部單線程高效率地維護事件循環(huán)隊列來實現(xiàn)的,沒有多線程的資源占用和上下文的切換。 深入淺出Node.js 一直想致力于寫一篇關(guān)于廣義講解Node.js系統(tǒng)的文章,苦于時間有限,資源有限。這篇文章是在結(jié)合自己的學(xué)習(xí)心得以及與行業(yè)大佬共同探討下爭對于熟練掌握JS語言后的廣義Node.js.至于為什么...
摘要:深入淺出一直想致力于寫一篇關(guān)于廣義講解系統(tǒng)的文章,苦于時間有限,資源有限。事件驅(qū)動機制是通過內(nèi)部單線程高效率地維護事件循環(huán)隊列來實現(xiàn)的,沒有多線程的資源占用和上下文的切換。 深入淺出Node.js 一直想致力于寫一篇關(guān)于廣義講解Node.js系統(tǒng)的文章,苦于時間有限,資源有限。這篇文章是在結(jié)合自己的學(xué)習(xí)心得以及與行業(yè)大佬共同探討下爭對于熟練掌握JS語言后的廣義Node.js.至于為什么...
閱讀 2574·2021-11-22 13:53
閱讀 4081·2021-09-28 09:47
閱讀 865·2021-09-22 15:33
閱讀 817·2020-12-03 17:17
閱讀 3316·2019-08-30 13:13
閱讀 2123·2019-08-29 16:09
閱讀 1181·2019-08-29 12:24
閱讀 2455·2019-08-28 18:14