Node.js http モジュールの使用

Node.js http モジュールの使用

序文

Node.js 開発の目的は、JavaScript で Web サーバー プログラムを作成することです。 JavaScript は実際にブラウザ側のスクリプトを支配しているため、その利点は、世界で最も多くのフロントエンド開発者がいることです。すでに JavaScript フロントエンド開発を習得していて、バックエンド開発に JavaScript を適用する方法を学習すれば、真のフルスタック開発者になることができます。

ウェブ

Web サーバー プログラムがどのように動作するかを理解するには、まず、HTTP プロトコルの基本を理解する必要があります。 HTTP プロトコルに慣れていない場合は、まず HTTP プロトコルの概要をご覧ください。

HTTP サーバー

HTTP サーバー プログラムを開発し、TCP 接続を処理し、HTTP を解析することを最初から行うのは非現実的です。これらのタスクは、実際には Node.js に付属する http モジュールによって完了されています。アプリケーションは HTTP プロトコルを直接処理するのではなく、http モジュールによって提供される要求オブジェクトと応答オブジェクトを操作します。

リクエスト オブジェクトは HTTP リクエストをカプセル化します。リクエスト オブジェクトのプロパティとメソッドを呼び出すことで、HTTP リクエストのすべての情報を取得できます。

レスポンス オブジェクトは HTTP レスポンスをカプセル化します。レスポンス オブジェクトのメソッドを操作することで、ブラウザーに HTTP レスポンスを返すことができます。

Node.js を使用して HTTP サーバー プログラムを実装するのは非常に簡単です。すべてのリクエストに対して Hello world! を返す最も単純な Web プログラム hello.js を実装してみましょう。

'厳密な使用';
var http = require('http'); // http モジュールをインポートします // http サーバーを作成し、コールバック関数を渡します。コールバック関数はリクエストとレスポンスのオブジェクトを受け取ります。var server = http.createServer(function (request, response){
console.log(request.method + ': ' + request.url); // HTTP リクエストのメソッドと URL を取得します。
response.writeHead(200, {'Content-Type': 'text/html'}); // HTTP レスポンス 200 を response に書き込み、Content-Type: text/html を設定します。
response.end('<h1>Hello world!</h1>'); });// HTTPレスポンスのHTMLコンテンツをresponseに書き込む
server.listen(8080); // サーバーがポート 8080 を listen できるようにします console.log('サーバーは http://127.0.0.1:8080/ で実行されています');

コマンドプロンプトでプログラムを実行すると、次の出力が表示されます。

$ node hello.js サーバーは http://127.0.0.1:8080/ で実行されています

コマンド プロンプトを閉じずに、ブラウザーを開いて http://localhost:8080 と入力し、サーバーの応答を確認します。

同時に、コマンド プロンプト ウィンドウでは、プログラムによって印刷された要求情報を確認できます。

得る: /

取得: /favicon.ico

これは私たちの最初の HTTP サーバー プログラムです。

ファイルサーバー

上記のWebプログラムを引き続き拡張していきましょう。ディレクトリを設定して、Web プログラムをファイル サーバーに変えることができます。これを実現するには、request.url 内のパスを解析し、対応するファイルをローカルで見つけて、ファイルの内容を送信するだけです。

URL を解析するには、Node.js が提供する url モジュールが必要です。使い方は非常に簡単です。parse() を通じて文字列を Url オブジェクトに解析します。

'厳密な使用';
var url = require('url');

console.log(url.parse('http://user:[email protected]:8080/path/to/file?query=string#hash'));

結果は次のとおりです。

Url { プロトコル: 'http:'、スラッシュ: true、認証: 'user:pass'、ホスト: 'host.com:8080'、ポート: '8080'、ホスト名: 'host.com'、ハッシュ: '#hash'、検索: '?query=string'、クエリ: 'query=string'、パス名: '/path/to/file'、パス: '/path/to/file?query=string'、href: 'http://user:[email protected]:8080/path/to/file?query=string#hash' }

ローカル ファイル ディレクトリを処理するには、Node.js が提供するパス モジュールを使用する必要があります。これにより、ディレクトリを簡単に構築できます。

'厳密な使用';
var パス = require('パス');
var workDir = path.resolve('.'); // 現在のディレクトリ ('/Users/michael') を解決します
var filePath = path.join(workDir, 'pub', 'index.html'); // 完全なファイル パスを結合します: 現在のディレクトリ + 'pub' + 'index.html' ('/Users/michael/pub/index.html')

オペレーティング システムに依存するファイル パスを正しく処理するには、パス モジュールを使用します。 Windows では、返されるパスは C:\Users\michael\static\index.html に似ているため、パスの連結について心配する必要はありません。

最後に、ファイル サーバー file_server.js を実装します。

'厳密な使用';
var fs = require('fs'),url = require('url'),path = require('path'),http = require('http');
var root = path.resolve(process.argv[2] || '.'); // コマンドラインパラメータからルートディレクトリを取得します。デフォルトは現在のディレクトリです。 console.log('Static root dir: ' + root);
var server = http.createServer(function (request, response){// サーバーを作成する var pathname = url.parse(request.url).pathname;// '/css/bootstrap.css' のような URL のパスを取得する
var filepath = path.join(root, pathname); // '/srv/www/css/bootstrap.css' のような対応するローカル ファイル パスを取得します。
fs.stat(filepath, function (err, stats) {if (!err && stats.isFile()){// ファイル ステータスを取得console.log('200 ' + request.url);// エラーなし、ファイルが存在response.writeHead(200);// 200 応答を送信// ファイル ストリームを応答に直接送信:
fs.createReadStream(ファイルパス).pipe(応答);    

} それ以外 {
console.log('404 ' + request.url); // エラーまたはファイルが存在しません response.writeHead(404); response.end('404 Not Found'); } }); }); // 404 応答を送信します server.listen(8080);

console.log('サーバーはhttp://127.0.0.1:8080/で実行されています');

ファイルの内容を手動で読み取る必要はありません。レスポンス オブジェクト自体は書き込み可能なストリームであるため、pipe() メソッドを使用してファイルの内容を自動的に読み取り、HTTP レスポンスに出力することができます。

コマンドラインで node file_server.js /path/to/dir を実行し、/path/to/dir をローカル コンピューター上の有効なディレクトリに変更し、ブラウザーに http://localhost:8080/index.html と入力します。

現在のディレクトリに index.html ファイルが存在する限り、サーバーはファイルの内容をブラウザに送信できます。コンソール出力を観察します。

200 /インデックス.html

200 /css/uikit.min.css

200 /js/jquery.min.js

200 /fonts/fontawesome-webfont.woff2

最初のリクエストはブラウザが index.html ページを要求するものであり、後続のリクエストはブラウザが HTML を解析した後に送信した他のリソースのリクエストです。

練習する

ブラウザに http://localhost:8080/ と入力すると、プログラムは HTTP リクエストがファイルではなくディレクトリに対するものであると認識するため、404 が返されます。 file_server.js を変更してください。要求されたパスがディレクトリの場合、ディレクトリ内で index.html と default.html を順番に自動的に検索します。見つかった場合は、HTML ファイルの内容を返します。

参照ソースコード

http サーバー コード (静的 Web サイトを含む)

https://github.com/michaelliao/learn-javascript/tree/master/samples/node/http

以上がNode.jsのhttpモジュールの詳しい使い方です。Node.jsについてさらに詳しく知りたい方は、123WORDPRESS.COMの関連記事もぜひご覧ください!

以下もご興味があるかもしれません:
  • Node.js URL モジュール入門
  • node.js パスモジュールの詳細な理解
  • node.js の http モジュールと url モジュールの簡単な紹介
  • node.js http モジュールの詳細な理解
  • node.js-pathモ​​ジュールについてどれくらい知っていますか
  • Node.js の基礎: パス モジュール、URL モジュール、http モジュールの使用方法の詳細説明

<<:  Docker に ElasticSearch 6.x をインストールする詳細なチュートリアル

>>:  MySQLの構文、特殊記号、正規表現の詳細な説明

推薦する

MySQLデータベースの基礎知識

目次1. データベースを理解する1.1 データベースとデータ構造の関係1.2 なぜデータベースが必要...

React の 10 個のフックの紹介

目次ReactHook とは何ですか? Reactは現在フックを提供している1. 使用状態2.use...

MySQL ロール関数の紹介

目次序文: 1. 役割の紹介2. 役割に関連する操作要約:序文:前回の記事では、MySQLの権限管理...

mysqlは内部コマンドエラーの解決策ではありません

「mysqlは内部コマンドではありません」というエラーは、mysqlのbinディレクトリパスが環境変...

MySQL 5.x 以降を使用している場合のエラー #1929 列 ''createtime'' の日付時刻値が正しくありません: '''' の簡単な解決方法

MySQL をインストールした後、テーブル データを保存および削除しようとすると、常にエラー メッセ...

Docker のポート解放失敗の解決策

今日、非常に奇妙な状況に遭遇しました。docker イメージを更新した後、docker-compos...

MySQL 最適化ソリューション リファレンス

最適化によって発生する可能性のある問題最適化は必ずしも単純な環境で実行されるわけではなく、実稼働環境...

Linux での一般的なシェル スクリプト コマンドと関連知識

目次1. 覚えておくべき知識1. 変数タイプ2. シェル変数の説明3. シングルクォート、ダブルクォ...

MySQLにおけるACIDトランザクションの実装原理の詳細な説明

導入いつものように、シーンから始めましょう〜インタビュアー:「トランザクションの4つの特性をご存知で...

Vue 大画面データ表示例

効率的に要件を満たし、コンポーネント ライブラリの肥大化や車輪の再発明を避けるために、私は以前、大画...

HTML 中国語文字エンコード標準の概要

HTML では、Web ページで使用されるエンコーディングを指定する必要があります。一般的な指定方法...

Docker環境にJenkinsコンテナをインストールする詳細なチュートリアル

推奨される Docker 学習教材: https://www.runoob.com/docker/d...

Docker プライマリ ネットワーク ポート マッピング構成

ポートマッピングDocker コンテナを起動する前にポート マッピングを行わないと、コンテナ外部のネ...

Dockerでnginxを実行し、ローカルディレクトリをイメージにマウントする方法

1 hupからイメージを取得する docker プル nginx 2 マウントするディレクトリを作成...

CentOS6.9 での MySQL 5.7.17 のインストールと設定のチュートリアル

CentOS6.9はMysql5.7をインストールします。参考までに、詳細は次のとおりです。 1. ...