Node.js は、そのモジュールシステム、非同期モデル、ストリーミング I/O に適合するいくつかのデザインパターンに依拠しています。すべてのバックエンド開発者が認識しておくべき最も一般的なものは次のとおりです:
module.exports / export を通じて公開 API を露出し、内部を非公開に保ちます。Node におけるコード構成の基盤です。// db.js — すべての `require("./db")` はこの同じプールを得ます (module cache によるシングルトン)。
const pool = createPool(process.env.DATABASE_URL);
module.exports = pool;
function createLogger(kind) {
return kind === "json" ? new JsonLogger() : new TextLogger();
}
EventEmitter、ストリーム、ほとんどのコアモジュールがこれを使います。const { EventEmitter } = require("node:events");
const bus = new EventEmitter();
bus.on("order:paid", (o) => sendReceipt(o));
bus.emit("order:paid", order);
(ctx, next) を受け取る関数のパイプラインで、Express/Koa によって普及しました。横断的関心事 (認証、ロギング、バリデーション) に最適です。app.use((req, res, next) => { req.startedAt = Date.now(); next(); });
const { pipeline } = require("node:stream/promises");
await pipeline(fs.createReadStream("in"), gzip(), fs.createWriteStream("out.gz"));
| 必要なこと | パターン |
|---|---|
| 1 つの共有リソース | Singleton (module cache) |
オブジェクトを構築し new を隠す | Factory |
| 非同期イベントに反応する | Observer / EventEmitter |
| 横断的な request ロジック | Middleware |
| 大きなデータを安全に処理する | Streams / pipeline |
| テスト可能で疎結合な依存関係 | Dependency Injection |
パターンは共有された語彙です。「設定はモジュールキャッシュされたシングルトンだ」や「認証はミドルウェアだ」と言えば、数語で設計を伝えられます。Node 自身のコア (EventEmitter、ストリーム、モジュールシステム) はこれらから構築されているため、それらを認識できればフレームワークを読み、自分のサービスを構造化するのに役立ちます。面接官はこの質問を使って、あなたが場当たり的にコールバックを繋ぐのではなく、適合するパターンに手を伸ばせるか — そして、シングルトンがグローバル状態をテストしにくくするといったトレードオフを知っているか — を確認します。
ジュニアからシニアまで、詳細な回答付きのIT面接質問ライブラリ。
寄付する