検索
ホームページウェブフロントエンドjsチュートリアルExpress.js のマスタリング: ディープダイブ

Mastering Express.js: A Deep Dive

Express は、Node.js で非常に一般的に使用される Web サーバー アプリケーション フレームワークです。基本的に、フレームワークは特定のルールに準拠したコード構造であり、次の 2 つの重要な特性があります。

  • API をカプセル化することで、開発者はビジネス コードの作成に集中できるようになります。
  • プロセスと標準仕様が確立されています。

Express フレームワークの中心的な機能は次のとおりです:

  • さまざまな HTTP リクエストに応答するようにミドルウェアを構成できます。
  • さまざまな種類の HTTP リクエスト アクションを実行するためのルート テーブルを定義します。
  • HTML ページの動的なレンダリングを実現するためにテンプレートにパラメータを渡すことをサポートします。

この記事では、シンプルな LikeExpress クラスを実装することで、Express がミドルウェアの登録、次のメカニズム、およびルート処理をどのように実装するかを分析します。

高速分析

まず、2 つの Express コード例を通じて、Express が提供する機能を調べてみましょう:

Express 公式ウェブサイト Hello World の例

const express = require('express');
const app = express();
const port = 3000;

app.get('/', (req, res) => {
    res.send('Hello World!');
});

app.listen(port, () => {
    console.log(`Example app listening at http://localhost:${port}`);
});

エントリファイルapp.jsの分析

以下は、express-generator スキャフォールディングによって生成された Express プロジェクトのエントリ ファイル app.js のコードです。

// Handle errors caused by unmatched routes
const createError = require('http-errors');
const express = require('express');
const path = require('path');

const indexRouter = require('./routes/index');
const usersRouter = require('./routes/users');

// `app` is an Express instance
const app = express();

// View engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

// Parse JSON format data in post requests and add the `body` field to the `req` object
app.use(express.json());
// Parse the urlencoded format data in post requests and add the `body` field to the `req` object
app.use(express.urlencoded({ extended: false }));

// Static file handling
app.use(express.static(path.join(__dirname, 'public')));

// Register top-level routes
app.use('/', indexRouter);
app.use('/users', usersRouter);

// Catch 404 errors and forward them to the error handler
app.use((req, res, next) => {
    next(createError(404));
});

// Error handling
app.use((err, req, res, next) => {
    // Set local variables to display error messages in the development environment
    res.locals.message = err.message;
    // Decide whether to display the full error according to the environment variable. Display in development, hide in production.
    res.locals.error = req.app.get('env') === 'development'? err : {};
    // Render the error page
    res.status(err.status || 500);
    res.render('error');
});

module.exports = app;

上記の 2 つのコード セグメントから、Express インスタンス アプリには主に 3 つのコア メソッドがあることがわかります。

  1. app.use([path,] callback [, callback...]): ミドルウェアの登録に使用されます。リクエストパスが設定されたルールと一致すると、対応するミドルウェア機能が実行されます。
    • path: ミドルウェア機能を呼び出すためのパスを指定します。
    • callback: コールバック関数はさまざまな形式を取ることができます。単一のミドルウェア関数、カンマで区切られた一連のミドルウェア関数、ミドルウェア関数の配列、または上記すべての組み合わせを指定できます。
  2. app.get() および app.post(): これらのメソッドは us​​e() に似ており、ミドルウェアを登録するためのものでもあります。ただし、これらは HTTP リクエスト メソッドにバインドされています。対応する HTTP リクエスト メソッドが使用された場合にのみ、関連するミドルウェアの登録がトリガーされます。
  3. app.listen(): httpServer を作成し、server.listen() に必要なパラメータを渡す役割を果たします。

コードの実装

Express コードの機能の分析に基づいて、Express の実装は次の 3 つの点に焦点を当てていることがわかります。

  • ミドルウェア機能の登録プロセス。
  • ミドルウェア機能の中核となる次のメカニズム。
  • パスマッチングに重点を置いたルート処理。

これらの点に基づいて、以下の簡単な LikeExpress クラスを実装します。

1. クラスの基本構成

まず、このクラスが実装する必要がある主なメソッドを明確にします。

  • use(): 一般的なミドルウェアの登録を実装します。
  • get() と post(): HTTP リクエストに関連するミドルウェアの登録を実装します。
  • listen(): 基本的に、これは httpServer の listen() 関数です。このクラスの listen() 関数では、httpServer が作成され、パラメーターが渡され、リクエストがリッスンされ、コールバック関数 (req, res) => が実行されます。 {} が実行されます。

ネイティブ ノード httpServer の使用法を確認します:

const express = require('express');
const app = express();
const port = 3000;

app.get('/', (req, res) => {
    res.send('Hello World!');
});

app.listen(port, () => {
    console.log(`Example app listening at http://localhost:${port}`);
});

したがって、LikeExpress クラスの基本構造は次のとおりです。

// Handle errors caused by unmatched routes
const createError = require('http-errors');
const express = require('express');
const path = require('path');

const indexRouter = require('./routes/index');
const usersRouter = require('./routes/users');

// `app` is an Express instance
const app = express();

// View engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

// Parse JSON format data in post requests and add the `body` field to the `req` object
app.use(express.json());
// Parse the urlencoded format data in post requests and add the `body` field to the `req` object
app.use(express.urlencoded({ extended: false }));

// Static file handling
app.use(express.static(path.join(__dirname, 'public')));

// Register top-level routes
app.use('/', indexRouter);
app.use('/users', usersRouter);

// Catch 404 errors and forward them to the error handler
app.use((req, res, next) => {
    next(createError(404));
});

// Error handling
app.use((err, req, res, next) => {
    // Set local variables to display error messages in the development environment
    res.locals.message = err.message;
    // Decide whether to display the full error according to the environment variable. Display in development, hide in production.
    res.locals.error = req.app.get('env') === 'development'? err : {};
    // Render the error page
    res.status(err.status || 500);
    res.render('error');
});

module.exports = app;

2. ミドルウェアの登録

app.use([path,] callback [, callback...]) から、ミドルウェアは関数の配列または単一の関数であることがわかります。実装を簡素化するために、ミドルウェアを関数の配列として均一に処理します。 LikeExpress クラスでは、use()、get()、および post() の 3 つのメソッドはすべてミドルウェアの登録を実装できます。リクエスト方法の違いにより、トリガーされるミドルウェアのみが異なります。そこで次のことを検討します。

  • 一般的なミドルウェア登録機能を抽象化します。
  • これら 3 つのメソッドのミドルウェア関数の配列を作成して、さまざまなリクエストに対応するミドルウェアを保存します。 use() はすべてのリクエストに対する一般的なミドルウェア登録メソッドであるため、 use() ミドルウェアを格納する配列は get() と post() の配列の結合になります。

ミドルウェアキュー配列

クラス内のメソッドから簡単にアクセスできるように、ミドルウェア配列はパブリック領域に配置する必要があります。そこで、ミドルウェアの配列をコンストラクター関数constructor()に入れました。

const http = require("http");
const server = http.createServer((req, res) => {
    res.end("hello");
});
server.listen(3003, "127.0.0.1", () => {
    console.log("node service started successfully");
});

ミドルウェア登録機能

ミドルウェアの登録とは、対応するミドルウェア配列にミドルウェアを格納することを意味します。ミドルウェア登録関数は、受信パラメータを解析する必要があります。最初のパラメータはルートまたはミドルウェアである可能性があるため、最初にそれがルートであるかどうかを判断する必要があります。存在する場合は、そのまま出力します。それ以外の場合、デフォルトはルート ルートであり、残りのミドルウェア パラメーターを配列に変換します。

const http = require('http');

class LikeExpress {
    constructor() {}

    use() {}

    get() {}

    post() {}

    // httpServer callback function
    callback() {
        return (req, res) => {
            res.json = function (data) {
                res.setHeader('content-type', 'application/json');
                res.end(JSON.stringify(data));
            };
        };
    }

    listen(...args) {
        const server = http.createServer(this.callback());
        server.listen(...args);
    }
}

module.exports = () => {
    return new LikeExpress();
};

use()、get()、post()の実装

一般的なミドルウェア登録関数 register() を使用すると、対応する配列にミドルウェアを格納するだけで、use()、get()、post() を簡単に実装できます。

const express = require('express');
const app = express();
const port = 3000;

app.get('/', (req, res) => {
    res.send('Hello World!');
});

app.listen(port, () => {
    console.log(`Example app listening at http://localhost:${port}`);
});

3. ルートマッチング処理

登録関数の最初のパラメータがルートの場合、リクエスト パスがルートと一致するか、そのサブルートである場合にのみ、対応するミドルウェア関数がトリガーされます。したがって、リクエスト メソッドに従って一致するルートのミドルウェア配列を抽出するルート マッチング関数と、後続の callback() 関数を実行するためのリクエスト パスが必要です。

// Handle errors caused by unmatched routes
const createError = require('http-errors');
const express = require('express');
const path = require('path');

const indexRouter = require('./routes/index');
const usersRouter = require('./routes/users');

// `app` is an Express instance
const app = express();

// View engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

// Parse JSON format data in post requests and add the `body` field to the `req` object
app.use(express.json());
// Parse the urlencoded format data in post requests and add the `body` field to the `req` object
app.use(express.urlencoded({ extended: false }));

// Static file handling
app.use(express.static(path.join(__dirname, 'public')));

// Register top-level routes
app.use('/', indexRouter);
app.use('/users', usersRouter);

// Catch 404 errors and forward them to the error handler
app.use((req, res, next) => {
    next(createError(404));
});

// Error handling
app.use((err, req, res, next) => {
    // Set local variables to display error messages in the development environment
    res.locals.message = err.message;
    // Decide whether to display the full error according to the environment variable. Display in development, hide in production.
    res.locals.error = req.app.get('env') === 'development'? err : {};
    // Render the error page
    res.status(err.status || 500);
    res.render('error');
});

module.exports = app;

次に、httpServer のコールバック関数 callback() で、実行する必要があるミドルウェアを抽出します。

const http = require("http");
const server = http.createServer((req, res) => {
    res.end("hello");
});
server.listen(3003, "127.0.0.1", () => {
    console.log("node service started successfully");
});

4. 次の仕組みの実装

Express ミドルウェア関数のパラメーターは req、res、next です。next は関数です。これを呼び出すことによってのみ、ES6 Generator の next() と同様に、ミドルウェア関数を順番に実行できます。私たちの実装では、次の要件を持つ next() 関数を記述する必要があります:

  • 毎回、ミドルウェア キュー配列からミドルウェアを 1 つずつ順番に抽出します。
  • 抽出したミドルウェアに next() 関数を渡します。ミドルウェア配列はパブリックであるため、 next() が実行されるたびに、配列内の最初のミドルウェア関数が取り出されて実行され、ミドルウェアの順次実行の効果が得られます。
const http = require('http');

class LikeExpress {
    constructor() {}

    use() {}

    get() {}

    post() {}

    // httpServer callback function
    callback() {
        return (req, res) => {
            res.json = function (data) {
                res.setHeader('content-type', 'application/json');
                res.end(JSON.stringify(data));
            };
        };
    }

    listen(...args) {
        const server = http.createServer(this.callback());
        server.listen(...args);
    }
}

module.exports = () => {
    return new LikeExpress();
};

エクスプレスコード

constructor() {
    // List of stored middleware
    this.routes = {
        all: [], // General middleware
        get: [], // Middleware for get requests
        post: [], // Middleware for post requests
    };
}

Leapcell: Web ホスティング、非同期タスク、Redis のための次世代サーバーレス プラットフォーム

Mastering Express.js: A Deep Dive

最後に、Express の導入に非常に適したプラットフォームである Leapcell を紹介します。

Leapcell は、次の特徴を持つサーバーレス プラットフォームです:

1. 多言語サポート

  • JavaScript、Python、Go、または Rust を使用して開発します。

2. 無制限のプロジェクトを無料でデプロイ

  • 使用料金のみお支払いください。リクエストや料金はかかりません。

3. 比類のないコスト効率

  • アイドル料金なしの従量課金制。
  • 例: $25 は、平均応答時間 60 ミリ秒で 694 万のリクエストをサポートします。

4. 合理化された開発者エクスペリエンス

  • 直感的な UI でセットアップが簡単。
  • 完全に自動化された CI/CD パイプラインと GitOps の統合。
  • 実用的な洞察を得るリアルタイムのメトリクスとログ。

5. 容易な拡張性と高性能

  • 自動スケーリングにより、高い同時実行性を簡単に処理できます。
  • 運用上のオーバーヘッドはゼロです。構築だけに集中してください。

ドキュメントでさらに詳しく見てみましょう!

Leapcell Twitter: https://x.com/LeapcellHQ

以上がExpress.js のマスタリング: ディープダイブの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
JavaScript、C、およびブラウザの関係JavaScript、C、およびブラウザの関係May 01, 2025 am 12:06 AM

はじめに私はあなたがそれを奇妙に思うかもしれないことを知っています、JavaScript、C、およびブラウザは正確に何をしなければなりませんか?彼らは無関係であるように見えますが、実際、彼らは現代のウェブ開発において非常に重要な役割を果たしています。今日は、これら3つの間の密接なつながりについて説明します。この記事を通して、JavaScriptがブラウザでどのように実行されるか、ブラウザエンジンでのCの役割、およびそれらが協力してWebページのレンダリングと相互作用を駆動する方法を学びます。私たちは皆、JavaScriptとブラウザの関係を知っています。 JavaScriptは、フロントエンド開発のコア言語です。ブラウザで直接実行され、Webページが鮮明で興味深いものになります。なぜJavascrを疑問に思ったことがありますか

node.jsは、型を使用してストリーミングしますnode.jsは、型を使用してストリーミングしますApr 30, 2025 am 08:22 AM

node.jsは、主にストリームのおかげで、効率的なI/Oで優れています。 ストリームはデータを段階的に処理し、メモリの過負荷を回避します。大きなファイル、ネットワークタスク、リアルタイムアプリケーションの場合。ストリームとTypeScriptのタイプの安全性を組み合わせることで、パワーが作成されます

Python vs. JavaScript:パフォーマンスと効率の考慮事項Python vs. JavaScript:パフォーマンスと効率の考慮事項Apr 30, 2025 am 12:08 AM

PythonとJavaScriptのパフォーマンスと効率の違いは、主に以下に反映されています。1)解釈された言語として、Pythonはゆっくりと実行されますが、開発効率が高く、迅速なプロトタイプ開発に適しています。 2)JavaScriptはブラウザ内の単一のスレッドに限定されていますが、マルチスレッドおよび非同期I/Oを使用してnode.jsのパフォーマンスを改善でき、両方とも実際のプロジェクトで利点があります。

JavaScriptの起源:その実装言語の調査JavaScriptの起源:その実装言語の調査Apr 29, 2025 am 12:51 AM

JavaScriptは1995年に発信され、Brandon Ikeによって作成され、言語をCに実現しました。 2。JavaScriptのメモリ管理とパフォーマンスの最適化は、C言語に依存しています。 3. C言語のクロスプラットフォーム機能は、さまざまなオペレーティングシステムでJavaScriptを効率的に実行するのに役立ちます。

舞台裏:JavaScriptをパワーする言語は何ですか?舞台裏:JavaScriptをパワーする言語は何ですか?Apr 28, 2025 am 12:01 AM

JavaScriptはブラウザとnode.js環境で実行され、JavaScriptエンジンに依存してコードを解析および実行します。 1)解析段階で抽象的構文ツリー(AST)を生成します。 2)ASTをコンパイル段階のバイトコードまたはマシンコードに変換します。 3)実行段階でコンパイルされたコードを実行します。

PythonとJavaScriptの未来:傾向と予測PythonとJavaScriptの未来:傾向と予測Apr 27, 2025 am 12:21 AM

PythonとJavaScriptの将来の傾向には、1。Pythonが科学コンピューティングの分野での位置を統合し、AI、2。JavaScriptはWebテクノロジーの開発を促進します。どちらもそれぞれのフィールドでアプリケーションシナリオを拡大し続け、パフォーマンスをより多くのブレークスルーを行います。

Python vs. JavaScript:開発環境とツールPython vs. JavaScript:開発環境とツールApr 26, 2025 am 12:09 AM

開発環境におけるPythonとJavaScriptの両方の選択が重要です。 1)Pythonの開発環境には、Pycharm、Jupyternotebook、Anacondaが含まれます。これらは、データサイエンスと迅速なプロトタイピングに適しています。 2)JavaScriptの開発環境には、フロントエンドおよびバックエンド開発に適したnode.js、vscode、およびwebpackが含まれます。プロジェクトのニーズに応じて適切なツールを選択すると、開発効率とプロジェクトの成功率が向上する可能性があります。

JavaScriptはCで書かれていますか?証拠を調べるJavaScriptはCで書かれていますか?証拠を調べるApr 25, 2025 am 12:15 AM

はい、JavaScriptのエンジンコアはCで記述されています。1)C言語は、JavaScriptエンジンの開発に適した効率的なパフォーマンスと基礎となる制御を提供します。 2)V8エンジンを例にとると、そのコアはCで記述され、Cの効率とオブジェクト指向の特性を組み合わせて書かれています。3)JavaScriptエンジンの作業原理には、解析、コンパイル、実行が含まれ、C言語はこれらのプロセスで重要な役割を果たします。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境