這次帶給大家Node.js建立HTTP檔案伺服器步驟詳解,Node.js建立HTTP檔案伺服器的注意事項有哪些,下面就是實戰案例,一起來看一下。
HelloWorld範例只有示範意義,這次我們來搞一個實際的範例:檔案伺服器。我們使用Node.js建立一個HTTP協定的檔案伺服器,你可以使用瀏覽器或其它下載工具到檔案伺服器上下載檔案。
為了讀取檔案,我們會用到File System模組(名字是」fs」),Stream,我們還要分析URL,區別HTTP方法,還會用到EventEmitter。
檔案伺服器FileServer的程式碼
先上程式碼吧,還是簡單的:
// 引入http模块 var http = require("http"); var fs = require("fs"); // 创建server,指定处理客户端请求的函数 http.createServer( function(request, response) { //判断HTTP方法,只处理GET if(request.method != "GET"){ response.writeHead(403); response.end(); return null; } //此处也可使用URL模块来分析URL(https://nodejs.org/api/url.html) var sep = request.url.indexOf('?'); var filePath = sep <p style="text-align: left;">最大的變化,就在傳遞給createServer方法的參數了。 </p><p style="text-align: left;">我們根據request.method作了判斷,不是GET就回傳403。如果是呢,就判斷檔案是否存在,不存在,回傳404,存在就讀取資料寫給客戶端。邏輯就是這麼簡單。下面我們來介紹用到的新知識。 </p><p style="text-align: left;"><span style="color: #ff0000"><strong>File System</strong></span></p><p style="text-align: left;">要使用FileSystem,得用require引入fs模組,就如前面程式碼裡。 File System的API老長老長了,看這裡:https://nodejs.org/api/fs.html。我們只說用到的特性。 </p><p style="text-align: left;"><span style="color: #ff0000"><strong>取得檔案狀態</strong></span></p><p style="text-align: left;">在我們的FileServer裡,收到和客戶端請求時先透過fs.stat()方法取得文件狀態。 fs.stat()方法原型如下:</p><pre class="brush:php;toolbar:false">fs.stat(path, callback)
第一個參數是檔案路徑,第二個參數是回呼函數。 fs.stat()方法是異步的,結果透過回呼函數callback回傳。 callback的原型如下:
function(err, stats)
第一個參數指示是否出現了錯誤,第二個參數是一個對象,類型是fs.Stats,保存了檔案的狀態訊息,例如大小、建立時間、修改時間等。
FileServer的程式碼取得到檔案狀態後,讀取大小,呼叫http.ServerResponse的writeHead方法,設定HTTP狀態碼為200,也設定了Content-Length頭。程式碼如下:
複製程式碼 程式碼如下:
response.writeHead(200, {"Content-Type": "text/plain", "Content-Length" : stats.size})
ReadStream
接下來呢,我們呼叫fs.createReadStream建立了一個ReadStream物件。 ReadStream是Stream,也是EventEmitter。
fs.createReadStream方法原型如下:
fs.createReadStream(path[, options])
第一個參數是檔案路徑,第二個參數是可選的JSON對象,用來指定開啟檔案的一些選項,預設值如下:
{ flags: ‘r', encoding: null, fd: null, mode: 0666, autoClose: true }
autoClose屬性預設為true,讀完檔案或讀取出錯時,檔案會被自動關閉。 fd屬性可以關聯一個現有的檔案描述符,這樣就會忽略path,根據一個已經開啟的檔案來建立流。 options還可以有start和end項,指定起、止位置,讀取檔案的特定區域。如果我們要實現斷點續傳,就需要這個了,用法類似這樣:
fs.createReadStream('sample.mp4', {start: 1000, end: 10000});
encoding用來指定文件的編碼,這對於文本文件有特殊的意義,目前支持'utf8'、'ascii '和'base64'。
ReadStream讀取資料是異步的,一塊一塊的讀,讀到一部分就發送一個data事件,資料呢,會傳遞給與事件關聯的listener(實際上是一個回呼方法)。在我們的程式碼裡,只是呼叫response.write把資料寫給客戶端。注意,可能會多次呼叫response.write哦。又因為我們設定了Content-Length,所以不會採用chunked編碼方式。如果我們不設定Content-Length,那預設會啟用chunked方式。
ReadStream讀完檔案時會發射end事件,出錯時會發射error事件,我們監聽這兩個事件,簡單的終止回應。
我們在範例程式碼中看到了stream.on這種程式碼,下面來解釋。
EventEmitter
#Node.js基于V8引擎实现的事件驱动IO,是其最大最棒的特色之一。有了事件机制,就可以充分利用异步IO突破单线程编程模型的性能瓶颈,使得用JavaScript作后端开发有了实际意义。
EventEmitter的基本用法
events.EventEmitter是一个简单的事件发射器的实现,具有addListener、on、once、removeListener、emit等方法,开发者可以很方便的调用这些API监听某个事件或者发射某个事件。
我们在示例中用到的fs.ReadStream就是一个EventEmitter,它实现了stream.Readable接口,而stream.Readable具有data、error、end、close、readable等事件。
通常我们使用EventEmitter的on或addListener来监听一个事件,这个时间可能会多次触发,每次触发,我们提供的回调方法都会被调用。我们示例中的代码就是这样:
stream.on('data',function(chunk){ response.write(chunk); });
Node.js的事件机制,会给某个事件关联一个回调方法列表,这样多个关注者就可以监听同一个事件。每个事件发射时,可能会带有数据和状态,这些数据是通过回调方法的参数传递出来的。那某一个特定的事件,它对应的回调方法的参数是什么样子的,则由事件定义的那个类(实例)来决定。EventEmitter的emit方法原型如下:
emitter.emit(event[, arg1][, arg2][, ...])
这个原型说明一个事件的回调方法可以有一个或多个参数,也可以没有参数。要想知道某个事件的回调方法是否有参数、每个参数的含义,只好去找相关的API文档。stream.Readable的data事件的参数是chunk,Buffer类型,代表读到的数据。
如果我们只想监听某个事件一次,则可以调用EventEmitter的once方法。要想移除一个事件监听器,可以调用removeListener,想移除所有,则可以调用removeAllListener。
自定义事件
Node.js的很多模块都继承自Event模块。我们自己也可以通过继承EventEmitter来实现自己的对象,添加自己的自定义事件。
这里有个简单的例子:
var util=require("util"); var events = require("events"); function Ticker() { var self = this; events.EventEmitter.call(this); setInterval(function(){ self.emit("tick") }, 1000 ); } util.inherits(Ticker, events.EventEmitter); var ticker = new Ticker(); ticker.on("tick", function() { console.log("tick event"); });
在这个简单的例子里,我们定义了Ticker对象,通过全局方法setInterval开启了一个定时器,每隔1000毫秒发射一个名为“tick”的事件。
Node.js的工具模块封装了继承的方法,我们调用它来的inherits方法来完成Ticker对events.EventEmitter的继承。
自定义事件的使用方法,和Node.js内置模块提供的事件的用法完全一样。
相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!
推荐阅读:
以上是Node.js建立HTTP檔案伺服器步驟詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Node.js擅長於高效I/O,這在很大程度上要歸功於流。 流媒體匯總處理數據,避免內存過載 - 大型文件,網絡任務和實時應用程序的理想。將流與打字稿的類型安全結合起來創建POWE

Python和JavaScript在性能和效率方面的差異主要體現在:1)Python作為解釋型語言,運行速度較慢,但開發效率高,適合快速原型開發;2)JavaScript在瀏覽器中受限於單線程,但在Node.js中可利用多線程和異步I/O提升性能,兩者在實際項目中各有優勢。

JavaScript起源於1995年,由布蘭登·艾克創造,實現語言為C語言。 1.C語言為JavaScript提供了高性能和系統級編程能力。 2.JavaScript的內存管理和性能優化依賴於C語言。 3.C語言的跨平台特性幫助JavaScript在不同操作系統上高效運行。

JavaScript在瀏覽器和Node.js環境中運行,依賴JavaScript引擎解析和執行代碼。 1)解析階段生成抽象語法樹(AST);2)編譯階段將AST轉換為字節碼或機器碼;3)執行階段執行編譯後的代碼。

Python和JavaScript的未來趨勢包括:1.Python將鞏固在科學計算和AI領域的地位,2.JavaScript將推動Web技術發展,3.跨平台開發將成為熱門,4.性能優化將是重點。兩者都將繼續在各自領域擴展應用場景,並在性能上有更多突破。

Python和JavaScript在開發環境上的選擇都很重要。 1)Python的開發環境包括PyCharm、JupyterNotebook和Anaconda,適合數據科學和快速原型開發。 2)JavaScript的開發環境包括Node.js、VSCode和Webpack,適用於前端和後端開發。根據項目需求選擇合適的工具可以提高開發效率和項目成功率。

是的,JavaScript的引擎核心是用C語言編寫的。 1)C語言提供了高效性能和底層控制,適合JavaScript引擎的開發。 2)以V8引擎為例,其核心用C 編寫,結合了C的效率和麵向對象特性。 3)JavaScript引擎的工作原理包括解析、編譯和執行,C語言在這些過程中發揮關鍵作用。

JavaScript是現代網站的核心,因為它增強了網頁的交互性和動態性。 1)它允許在不刷新頁面的情況下改變內容,2)通過DOMAPI操作網頁,3)支持複雜的交互效果如動畫和拖放,4)優化性能和最佳實踐提高用戶體驗。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

禪工作室 13.0.1
強大的PHP整合開發環境

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境