ノード.jsの基礎知識と主要モジュールの使い方

1. Node.jsのコマンド

↑キーで前のコマンドに素早く移動できます

tabキーでファイルパスを自動補完できます

escキーでコマンドをクリアできます

clsコマンドでターミナルをクリアできます

2. ファイルシステムモジュール

fileSystemモジュールはNode.jsが提供するファイル操作用のモジュールで、ファイル操作に必要なメソッドとプロパティを提供しています

fileSystem.readFile()メソッドで指定ファイルの内容を読み取ります

fileSystem.writeFile()メソッドで指定ファイルに内容を書き込みます

使用するにはfileSystemモジュールをインポートする必要があります

例:const fileSystem = require('fs');

2.1 fileSystem.readFile()の構文形式

//1. fileSystemモジュールをインポート
const fileSystem = require('fs');

//2. fileSystem.readFile()メソッドを呼び出してファイルを読み取る
//パラメータ1:読み取るファイルのパス
//パラメータ2:読み取り時のエンコーディング形式、通常utf8を指定
//パラメータ3:コールバック関数、読み取りの成功/失敗結果を取得
fileSystem.readFile('./files/11.txt', 'utf8', function(error, dataStr) {
    console.log(error);
    //読み取り成功時はerrorがnull
    //読み取り失敗時はerrorがエラーオブジェクト、dataStrはundefined
    console.log('***********');
    console.log(dataStr);
})

ファイル読み取りの成功判定

const fileSystem = require('fs');
fileSystem.readFile('./files/1.txt', 'utf8', function(error, dataStr) {
    if (error) {
        return console.log('ファイル読み取り失敗!' + error.message);
    }
    console.log('ファイル読み取り成功' + dataStr);
})

2.2 fileSystem.writeFile()

注意:fileSystem.writeFile()メソッドはファイル作成のみ可能で、パス作成はできません

繰り返し呼び出すと新しい内容が古い内容を上書きします

const fileSystem = require('fs');
//パラメータ1:ファイルの保存パス
//パラメータ2:書き込む内容
//パラメータ3:コールバック関数
fileSystem.writeFile('f:./files/2.txt', 'abcd', function(error) {
    //ファイル書き込み成功時、errorはnull
    //ファイル書き込み失敗時、errorはエラーオブジェクト
    console.log(error);
})
const fileSystem = require('fs');
//パラメータ1:ファイルの保存パス
//パラメータ2:書き込む内容
//パラメータ3:コールバック関数
fileSystem.writeFile('./files/3.txt', 'abcd', function(error) {
    //ファイル書き込み成功時、errorはnull
    //ファイル書き込み失敗時、errorはエラーオブジェクト
    if (error) {
        return console.log(('ファイル書き込み失敗' + error.message));
    }
    console.log('ファイル書き込み成功');
})

2.3 fileSystemモジュールのパス動的結合の問題

__dirnameは現在のファイルが存在するディレクトリを示します

//__dirnameは現在のファイルが存在するディレクトリを示します
const fileSystem = require('fs');
fileSystem.readFile(__dirname + '/files/1.txt', 'utf8', function(error, dataStr) {
    if (error) {
        return console.log('ファイル読み取りエラー!' + error.message);
    }
    console.log(dataStr);
})

3. パスモジュール

pathModule.join()メソッドは複数のパスセグメントを1つの完全なパス文字列に結合します

pathModule.basename()メソッドはパス文字列からファイル名を解析します

インポート:

const pathModule = require('path');

pathModule.join()メソッドは複数のパスセグメントを1つの完全なパス文字列に結合します

const pathModule = require('path');
const fileSystem = require('fs');
//注意:../は前のパスを相殺します
const pathStr = pathModule.join('/a', '/b/c', '../', '/d', 'e');
console.log(pathStr);
// fileSystem.readFile(pathModule.join(__dirname, './files/1.txt'), 'utf8', function(error, dataStr) {
//     if (error) {
//         return console.log(error.message);
//     }
//     console.log(dataStr);
// })

pathModule.basename()メソッドはパス文字列からファイル名を解析します

const pathModule = require('path');
//ファイルの保存パスを定義
const filePath = '/a/b/c/index.html';
// const fullName = pathModule.basename(filePath);
// console.log(fullName);//index.html
const nameWithoutExt = pathModule.basename(filePath, '.html');
console.log(nameWithoutExt);//index

pathModule.extname()はパスの拡張子部分を取得できます

const pathModule = require('path');
//ファイルの保存パスを定義
const filePath = '/a/b/c/index.html';
const fileExt = pathModule.extname(filePath);
console.log(fileExt);//.html

4. HTTPモジュール

const webServer = require('http');

基本的なウェブサーバーの作成

//1. httpモジュールをインポート
const webServer = require('http');
//2. ウェブサーバーインスタンスを作成
const serverInstance = webServer.createServer();
//3. サーバーインスタンスにrequestイベントをバインドし、クライアントのリクエストを監視
serverInstance.on('request', function(clientRequest, serverResponse) {
    console.log('誰かが私たちのウェブサーバーにアクセスしました。');
})
//4. サーバーを起動
serverInstance.listen(80, function() {
    console.log('サーバーはhttp://127.0.0.1で実行中');
})

4.1 clientRequestオブジェクト

サーバーがクライアントのリクエストを受け取ると、serverInstance.on()でバインドされたrequestイベントハンドラが呼び出されます。イベントハンドラ内でクライアントに関連するデータや属性にアクセスするには、以下の方法を使用できます

const webServer = require('http');
const serverInstance = webServer.createServer();
//clientRequestはリクエストオブジェクトで、クライアント関連のデータと属性を含みます
serverInstance.on('request', (clientRequest) => {
    //clientRequest.urlはクライアントリクエストのURLアドレス
    const url = clientRequest.url;
    //clientRequest.methodはクライアントリクエストのメソッドタイプ
    const method = clientRequest.method;
    const str = `リクエストURLは${url}、リクエストメソッドは${method}`;
    console.log(str);
});

serverInstance.listen(80, () => {
    console.log('サーバーはhttp://127.0.0.1で実行中');
})

4.2 serverResponseオブジェクト

サーバーのrequestイベントハンドラ内で、サーバーに関連するデータや属性にアクセスするには、以下の方法を使用できます

const webServer = require('http');
const serverInstance = webServer.createServer();
//clientRequestはリクエストオブジェクトで、クライアント関連のデータと属性を含みます
serverInstance.on('request', (clientRequest, serverResponse) => {
    //clientRequest.urlはクライアントリクエストのURLアドレス
    const url = clientRequest.url;
    //clientRequest.methodはクライアントリクエストのメソッドタイプ
    const method = clientRequest.method;
    const str = `リクエストURLは${url}、リクエストメソッドは${method}`;
    console.log(str);
    //serverResponse.end()メソッドを呼び出し、クライアントにコンテンツを応答
    serverResponse.end(str);
});

serverInstance.listen(80, () => {
    console.log('サーバーはhttp://127.0.0.1で実行中');
})

4.3 中文文字化け問題の解決

const webServer = require('http');
const serverInstance = webServer.createServer();
serverInstance.on('request', (clientRequest, serverResponse) => {
    const url = clientRequest.url;
    const method = clientRequest.method;
    const str = `リクエストURLは${url}、リクエストメソッドは${method}`;
    //serverResponse.setHeader()メソッドを呼び出し、Content-Typeレスポンスヘッダーを設定し、中国語文字化け問題を解決
    serverResponse.setHeader('Content-Type', 'text/html; charset=utf-8')
    serverResponse.end(str);
})
serverInstance.listen(80, () => {
    console.log('サーバーはhttp://127.0.0.1で実行中');
})

4.4 異なるURLに応じて異なるHTMLコンテンツを応答

const webServer = require('http');
const serverInstance = webServer.createServer();
serverInstance.on('request', (clientRequest, serverResponse) => {
    //1. リクエストURLアドレスを取得
    const url = clientRequest.url;
    //2. デフォルトの応答コンテンツを404 Not foundに設定
    let content = '<h1>404 Not found!</h1>';
    //3. ユーザーが/または/index.htmlホームページをリクエストしているかどうかを判断
    if (url === '/' || url === '/index.html') {
        content = '<h1>ホームページ</h1>'
    } else if (url === '/about.html') {
        content = '<h1>アバウトページ</h1>'
    }

    //4. ユーザーが/about.htmlページをリクエストしているかどうかを判断

    //5. レスポンスヘッダーを設定し、文字化けを防止
    serverResponse.setHeader('Content-Type', 'text/html; charset=utf-8')
    //6. serverResponse.end()を使用してコンテンツをクライアントに応答
    serverResponse.end(content);
});

serverInstance.listen(80, () => {
    console.log('サーバーはhttp://127.0.0.1で実行中');
})

5. 統合時計ケース

//1. httpモジュールをインポート
const webServer = require('http');
//1.2 fileSystemモジュールをインポート
const fileSystem = require('fs');
//1.3 pathモジュールをインポート
const pathModule = require('path');

//2.1 ウェブサーバーを作成
const serverInstance = webServer.createServer();
//2.2 ウェブサーバーのrequestイベントを監視
serverInstance.on('request', (clientRequest, serverResponse) => {
    //3.1 クライアントリクエストのURLアドレスを取得
    const url = clientRequest.url;
    //3.2 リクエストURLアドレスを具体的なファイルパスにマッピング
    // const filePath = pathModule.join(__dirname, url)
    //5.1 空のファイルパスを予約
    let filePath = '';
    if (url === '/') {
        filePath = pathModule.join(__dirname, '/clock/index.html')
    } else {
        filePath = pathModule.join(__dirname, '/clock', url);
    }
    //4.1 マッピングされたファイルパスに基づいてファイル内容を読み取る
    fileSystem.readFile(filePath, 'utf-8', (error, dataStr) => {
        //4.2 読み取り失敗時、クライアントに固定エラーメッセージを応答
        if (error) return serverResponse.end('404 Not found!')
        //4.3 読み取り成功時、読み取り成功した内容をクライアントに応答
        serverResponse.end(dataStr);
    })
})

//2.3 サーバーを起動
serverInstance.listen(80, function() {
    console.log('サーバーはhttp://127.0.0.1で実行中');
})

6. require()メソッド

require()メソッドを使用して他のモジュールをロードすると、ロードされたモジュールのコードが実行されます

注意:requireでユーザー定義モジュールをロードする際、.js拡張子を省略できます

7. モジュールスコープ

- 関数スコープと同様に、カスタムモジュールで定義された変数、メソッドなどのメンバーは、現在のモジュール内でのみアクセスできます。このモジュールレベルのアクセス制限をモジュールスコープと呼びます

- グローバル変数汚染を防止

8. モジュールスコープのメンバーを外部に共有

- カスタムモジュールにはすべてmoduleオブジェクトがあり、現在のモジュールに関する情報を保存しています

- カスタムモジュール内でmodule.exportsオブジェクトを使用して、モジュール内のメンバーを外部に共有し、外部で使用できるようにします。カスタムモジュールをインポートすると、module.exportsが指すオブジェクトが取得されます。

- デフォルトでは、exportsとmodule.exportsは同じオブジェクトを指しています。最終的な共有結果は、module.exportsが指すオブジェクトを基準とします。

8.1 module.exportsオブジェクト

カスタムモジュール内では、デフォルトでmodule.exports = {}です

9. モジュール化仕様

- 各モジュール内で、module変数は現在のモジュールを表します

- module変数はオブジェクトで、module.exportsは外部インターフェースです

- あるモジュールをロードするとは、そのモジュールのmodule.exportsプロパティをロードすることです

10. npmとパッケージ

パッケージ:サードパーティモジュールをパッケージと呼びます

パッケージは組み込みモジュールをベースにパッケージ化されています

タグ: ノード.js ファイルシステム パス操作 Webサーバー モジュールシステム

5月20日 01:42 投稿