搜尋
首頁web前端js教程如何使用node.js建立http檔案伺服器

這次帶給大家如何使用node.js建立http檔案伺服器,使用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 Express安装与使用详细介绍

怎样操作Node.js 使用jade模板引擎

以上是如何使用node.js建立http檔案伺服器的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
es6数组怎么去掉重复并且重新排序es6数组怎么去掉重复并且重新排序May 05, 2022 pm 07:08 PM

去掉重复并排序的方法:1、使用“Array.from(new Set(arr))”或者“[…new Set(arr)]”语句,去掉数组中的重复元素,返回去重后的新数组;2、利用sort()对去重数组进行排序,语法“去重数组.sort()”。

JavaScript的Symbol类型、隐藏属性及全局注册表详解JavaScript的Symbol类型、隐藏属性及全局注册表详解Jun 02, 2022 am 11:50 AM

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于Symbol类型、隐藏属性及全局注册表的相关问题,包括了Symbol类型的描述、Symbol不会隐式转字符串等问题,下面一起来看一下,希望对大家有帮助。

原来利用纯CSS也能实现文字轮播与图片轮播!原来利用纯CSS也能实现文字轮播与图片轮播!Jun 10, 2022 pm 01:00 PM

怎么制作文字轮播与图片轮播?大家第一想到的是不是利用js,其实利用纯CSS也能实现文字轮播与图片轮播,下面来看看实现方法,希望对大家有所帮助!

JavaScript对象的构造函数和new操作符(实例详解)JavaScript对象的构造函数和new操作符(实例详解)May 10, 2022 pm 06:16 PM

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于对象的构造函数和new操作符,构造函数是所有对象的成员方法中,最早被调用的那个,下面一起来看一下吧,希望对大家有帮助。

JavaScript面向对象详细解析之属性描述符JavaScript面向对象详细解析之属性描述符May 27, 2022 pm 05:29 PM

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于面向对象的相关问题,包括了属性描述符、数据描述符、存取描述符等等内容,下面一起来看一下,希望对大家有帮助。

javascript怎么移除元素点击事件javascript怎么移除元素点击事件Apr 11, 2022 pm 04:51 PM

方法:1、利用“点击元素对象.unbind("click");”方法,该方法可以移除被选元素的事件处理程序;2、利用“点击元素对象.off("click");”方法,该方法可以移除通过on()方法添加的事件处理程序。

整理总结JavaScript常见的BOM操作整理总结JavaScript常见的BOM操作Jun 01, 2022 am 11:43 AM

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于BOM操作的相关问题,包括了window对象的常见事件、JavaScript执行机制等等相关内容,下面一起来看一下,希望对大家有帮助。

foreach是es6里的吗foreach是es6里的吗May 05, 2022 pm 05:59 PM

foreach不是es6的方法。foreach是es3中一个遍历数组的方法,可以调用数组的每个元素,并将元素传给回调函数进行处理,语法“array.forEach(function(当前元素,索引,数组){...})”;该方法不处理空数组。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前By尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具