ミドルウェアを使いこなしてExpress.js アプリケーションを強化しよう
Node.js / Express: app.use とは?
app.use
は、以下の役割を担います。
- ミドルウェアを登録する
- ミドルウェアの実行順序を制御する
- 特定のパスにのみミドルウェアを適用する
ミドルウェアには、さまざまな種類があります。
- ルーティング:リクエストのパスに基づいて処理を分岐する
- 認証:ユーザーの認証を行う
- ロギング:リクエストとレスポンスのログを出力する
- 静的ファイルの配信:HTML ファイルや画像ファイルなどの静的ファイルを配信する
- エラー処理:エラーが発生した時の処理を行う
app.use(middleware);
middleware
は、ミドルウェア関数を表す変数です。
例:ルーティングミドルウェア
以下の例は、/users
パスへのリクエストを処理するルーティングミドルウェアです。
app.use("/users", (req, res, next) => {
// `/users` パスへのリクエスト処理
next();
});
例:認証ミドルウェア
以下の例は、ユーザーの認証を行う認証ミドルウェアです。
app.use((req, res, next) => {
// ユーザー認証処理
if (isAuthenticated) {
next();
} else {
res.status(401).send("Unauthorized");
}
});
app.use
は、Express.js でミドルウェアを登録するために使用する関数です。ミドルウェアを使うことで、さまざまな機能をアプリケーションに追加することができます。
const express = require("express");
const app = express();
app.get("/", (req, res) => {
res.send("Hello World!");
});
app.use("/users", (req, res, next) => {
// `/users` パスへのリクエスト処理
console.log("リクエストパス:", req.path);
next();
});
app.get("/users/:id", (req, res) => {
// `/users/:id` パスへのリクエスト処理
console.log("ユーザーID:", req.params.id);
res.send("ユーザー情報");
});
app.listen(3000);
const express = require("express");
const jwt = require("jsonwebtoken");
const app = express();
app.use((req, res, next) => {
// ユーザー認証処理
const token = req.headers["authorization"];
if (!token) {
return res.status(401).send("Unauthorized");
}
try {
const decoded = jwt.verify(token, "secret");
req.user = decoded;
next();
} catch (err) {
return res.status(401).send("Unauthorized");
}
});
app.get("/", (req, res) => {
res.send("Hello World!");
});
app.get("/users/:id", (req, res) => {
// 認証済みユーザーのみアクセス可能
if (!req.user) {
return res.status(401).send("Unauthorized");
}
// ユーザー情報取得処理
res.send("ユーザー情報");
});
app.listen(3000);
エラー処理ミドルウェア
const express = require("express");
const app = express();
app.get("/", (req, res) => {
res.send("Hello World!");
});
app.use((err, req, res, next) => {
// エラー処理
console.error(err.stack);
res.status(500).send("エラーが発生しました");
});
app.listen(3000);
これらのサンプルコードは、app.use
の使い方を理解するのに役立ちます。
app.use 以外の方法
app.get() や app.post() などのルーティング関数
ルーティング関数に直接ミドルウェア関数を渡すことができます。
app.get("/users", (req, res, next) => {
// 認証ミドルウェア
const authMiddleware = (req, res, next) => {
// ユーザー認証処理
if (!req.user) {
return res.status(401).send("Unauthorized");
}
next();
};
authMiddleware(req, res, next);
// `/users` パスへのリクエスト処理
res.send("ユーザー情報");
});
app.all()
すべてのパスに適用されるミドルウェアを登録したい場合は、app.all()
を使用できます。
app.all((req, res, next) => {
// ログ出力ミドルウェア
const loggerMiddleware = (req, res, next) => {
console.log("リクエスト:", req.method, req.path);
next();
};
loggerMiddleware(req, res, next);
});
サードパーティ製のミドルウェアライブラリ
express-middleware
などのサードパーティ製のミドルウェアライブラリを使用することもできます。
const express = require("express");
const expressMiddleware = require("express-middleware");
const app = express();
app.use(expressMiddleware.cookieParser());
app.use(expressMiddleware.session());
app.get("/", (req, res) => {
res.send("Hello World!");
});
app.listen(3000);
これらの方法は、それぞれ異なる利点と欠点があります。状況に応じて適切な方法を選択する必要があります。
node.js express