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 < 0 ? request.url : request.url.slice(0, sep); console.log("GET file: " + filePath); //當文件存在時發送數據給客戶端,否則404 var fileStat = fs.stat("."+filePath, function(err, stats){ if(err) { response.writeHead(404); response.end(); return null; } //TODO:Content-Type應該根據文件類型設置 response.writeHead(200, {"Content-Type": "text/plain", "Content-Length": stats.size}); //使用Stream var stream = fs.createReadStream("."+filePath); stream.on('data',function(chunk){ response.write(chunk); }); stream.on('end',function(){ response.end(); }); stream.on('error',function(){ response.end(); }); } ); }).listen(8000); console.log("Hello World start listen on port 8000");最大的變化,就在傳遞給createServer方法的參數了。
我們根據request.method作了判斷,不是GET就返回403。如果是呢,就判斷文件是否存在,不存在,返回404,存在就讀取數據寫給客戶端。邏輯就是這么簡單。下面我們來介紹用到的新知識。
File System
要使用FileSystem,得用require引入fs模塊,就如前面代碼里那樣。File System的API老長老長了,看這里吧:https://nodejs.org/api/fs.html。我們只說用到的特性。
獲取文件狀態
在我們的FileServer里,收到和客戶端請求時先通過fs.stat()方法獲取文件狀態。fs.stat()方法原型如下:
fs.stat(path, callback)
第一個參數是文件路徑,第二個參數是回調函數。fs.stat()方法是異步的,結果通過回調函數callback返回。callback的原型如下:
function(err, stats)
第一個參數指示是否出現了錯誤,第二個參數是一個對象,類型是fs.Stats,保存了文件的狀態信息,比如大小、創建時間、修改時間等。
新聞熱點
疑難解答
圖片精選