Node.jsでHTTPファイルサーバーを作成する手順を詳しく解説

php中世界最好的语言
リリース: 2018-05-22 10:36:52
オリジナル
1697 人が閲覧しました

今回は、Node.js で HTTP ファイル サーバーを作成する手順について詳しく説明します。 Node.js で HTTP ファイル サーバーを作成する際の 注意事項 は何ですか?実際の事例を見てみましょう。 。

HelloWorld の例はデモンストレーションのみを目的としており、今回は実際的な例としてファイル サーバーを取り上げます。 Node.js を使用して HTTP プロトコルでファイル サーバーを作成します。ファイル サーバーからファイルをダウンロードするには、ブラウザまたはその他のダウンロード ツールを使用できます。

ファイルを読み取る

ために、ファイル システム モジュール (「fs」という名前)、ストリームを使用し、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 モジュールを導入する必要があります。ファイル システムの API は古くからあるものです。https://nodejs.org/api/fs.html をご覧ください。使用されている機能についてのみ説明します。

ファイルステータスの取得 FileServer では、クライアントリクエストを受信すると、まず fs.stat() メソッドを通じてファイルステータスを取得します。 fs.stat() メソッドのプロトタイプは次のとおりです:

fs.stat(path, callback)
ログイン後にコピー

最初のパラメーターはファイル パス、2 番目のパラメーターは

コールバック関数

です。 fs.stat() メソッドは非同期であり、結果はコールバック関数 callback を通じて返されます。コールバックのプロトタイプは次のとおりです。

最初のパラメーターは、エラーが発生したかどうかを示します。 2 番目のパラメーターは、サイズ、作成時間、変更などのファイルのステータス情報を保存する 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])
ログイン後にコピー

最初のパラメータはファイル パス、2 番目のパラメータはオプションの JSON オブジェクトで、ファイルを開くためのいくつかのオプションを指定するために使用されます。デフォルト値は次のとおりです:

{ flags: ‘r', 
encoding: null, 
fd: null, 
mode: 0666, 
autoClose: true 
}
ログイン後にコピー

autoClose 属性のデフォルト true の場合、ファイルの読み取り時または読み取りエラーが発生したときに、ファイルは自動的に閉じられます。 fd 属性は既存のファイル記述子に関連付けることができるため、パスは無視され、すでに開いているファイルに基づいてストリームが作成されます。オプションには開始項目と終了項目を指定したり、開始位置と終了位置を指定したり、ファイルの特定の領域を読み取ることもできます。ブレークポイント再開を実装したい場合は、これが必要です。

fs.createReadStream('sample.mp4', {start: 1000, end: 10000});
ログイン後にコピー

encoding は、ファイルのエンコーディングを指定するために使用されます。これは、現在、「utf8」、「ascii」をサポートしています。 ' と 'base64' '。

ReadStream はデータを非同期で読み取り、その一部を読み取った後、データ イベントをイベントに関連付けられたリスナー (実際にはコールバック メソッド) に渡します。このコードでは、response.write を呼び出してデータをクライアントに書き込むだけです。 response.write は複数回呼び出される可能性があることに注意してください。また、Content-Length を設定しているため、チャンク エンコーディングは使用されません。 Content-Length を設定しない場合、チャンク モードがデフォルトで有効になります。

ReadStream は、ファイルの読み取りが完了すると end イベントを発行し、エラーが発生すると error イベントを発行します。これら 2 つのイベントをリッスンして、単純に応答を終了します。

サンプルコードでstream.onのようなコードが出てきましたので、以下で説明していきます。

イベントエミッター

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中文网其它相关文章!

推荐阅读:

table表格内对某列内容进行搜索筛选步骤详解

node前端模板引擎Jade标签使用详解

以上がNode.jsでHTTPファイルサーバーを作成する手順を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート