Express は、Node.js で非常に一般的に使用される Web サーバー アプリケーション フレームワークです。基本的に、フレームワークは特定のルールに準拠したコード構造であり、次の 2 つの重要な特性があります。
Express フレームワークの中心的な機能は次のとおりです:
この記事では、シンプルな LikeExpress クラスを実装することで、Express がミドルウェアの登録、次のメカニズム、およびルート処理をどのように実装するかを分析します。
まず、2 つの Express コード例を通じて、Express が提供する機能を調べてみましょう:
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}`); });
以下は、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 つのコア メソッドがあることがわかります。
Express コードの機能の分析に基づいて、Express の実装は次の 3 つの点に焦点を当てていることがわかります。
これらの点に基づいて、以下の簡単な LikeExpress クラスを実装します。
まず、このクラスが実装する必要がある主なメソッドを明確にします。
ネイティブ ノード 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;
app.use([path,] callback [, callback...]) から、ミドルウェアは関数の配列または単一の関数であることがわかります。実装を簡素化するために、ミドルウェアを関数の配列として均一に処理します。 LikeExpress クラスでは、use()、get()、および post() の 3 つのメソッドはすべてミドルウェアの登録を実装できます。リクエスト方法の違いにより、トリガーされるミドルウェアのみが異なります。そこで次のことを検討します。
クラス内のメソッドから簡単にアクセスできるように、ミドルウェア配列はパブリック領域に配置する必要があります。そこで、ミドルウェアの配列をコンストラクター関数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(); };
一般的なミドルウェア登録関数 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}`); });
登録関数の最初のパラメータがルートの場合、リクエスト パスがルートと一致するか、そのサブルートである場合にのみ、対応するミドルウェア関数がトリガーされます。したがって、リクエスト メソッドに従って一致するルートのミドルウェア配列を抽出するルート マッチング関数と、後続の 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"); });
Express ミドルウェア関数のパラメーターは req、res、next です。next は関数です。これを呼び出すことによってのみ、ES6 Generator の 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 }; }
最後に、Express の導入に非常に適したプラットフォームである Leapcell を紹介します。
Leapcell は、次の特徴を持つサーバーレス プラットフォームです:
ドキュメントでさらに詳しく見てみましょう!
Leapcell Twitter: https://x.com/LeapcellHQ
以上がExpress.js のマスタリング: ディープダイブの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。