res.status() メソッド:シンプルでわかりやすいエラーコード設定
Express.js で HTTP エラーコードを指定する方法
Express.js は、Node.js 向けの Web アプリケーションフレームワークであり、HTTP エラーコードを含むさまざまな機能を提供しています。このチュートリアルでは、Express.js で HTTP エラーコードを指定する方法をいくつか紹介します。
方法 1: res.status() メソッドを使用する
最も一般的な方法は、res.status()
メソッドを使用して、応答に送信する HTTP ステータスコードを設定することです。このメソッドは、数値のステータスコードまたは、名前付きのステータスコード (例: '404' または 'not_found') を引数として受け取ります。
app.get('/users/:id', (req, res, next) => {
const userId = req.params.id;
try {
const user = await findUserById(userId);
if (!user) {
res.status(404).send('User not found');
return;
}
res.json(user);
} catch (err) {
next(err);
}
});
上記の例では、findUserById()
関数がユーザーを見つけることができなければ、res.status(404).send('User not found')
を使用して 404 エラーを返します。
方法 2: エラーハンドリング ミドルウェアを使用する
Express.js は、エラー処理を簡素化するためのエラーハンドリング ミドルウェアを提供しています。これらのミドルウェアは、エラーが発生したときに呼び出され、適切なステータスコードと応答を返します。
app.use((err, req, res, next) => {
console.error(err.stack);
if (err.status) {
res.status(err.status).send(err.message);
} else {
res.status(500).send('Internal Server Error');
}
});
上記の例では、エラーハンドリング ミドルウェアがすべてのエラーをキャッチし、エラーオブジェクトの status
プロパティ (存在する場合) を使用して適切なステータスコードを設定します。status
プロパティが存在しない場合は、500 の内部サーバーエラーを返します。
方法 3: カスタム エラー クラスを使用する
より複雑なエラー処理が必要な場合は、カスタム エラー クラスを作成できます。この方法により、エラーの詳細情報をカプセル化し、よりきめ細かなエラー処理が可能になります。
class UserNotFoundError extends Error {
constructor(userId) {
super(`User with ID ${userId} not found`);
this.status = 404;
}
}
app.get('/users/:id', async (req, res, next) => {
const userId = req.params.id;
try {
const user = await findUserById(userId);
if (!user) {
throw new UserNotFoundError(userId);
}
res.json(user);
} catch (err) {
next(err);
}
});
上記の例では、UserNotFoundError
というカスタム エラー クラスを作成し、ユーザーが見つからない場合にスローします。エラーハンドリング ミドルウェアは、このエラーをキャッチし、適切なステータスコード (404) とエラーメッセージを返します。
補足
- 上記は、Express.js で HTTP エラーコードを指定する一般的な方法のほんの一例です。
- 特定の状況やニーズに合った最適な方法は、アプリケーションによって異なる場合があります。
サンプル 1: res.status() メソッドを使用する
const express = require('express');
const app = express();
app.get('/users/:id', async (req, res, next) => {
const userId = req.params.id;
try {
const user = await findUserById(userId);
if (!user) {
res.status(404).send('ユーザーが見つかりません');
return;
}
res.json(user);
} catch (err) {
next(err);
}
});
app.use((err, req, res, next) => {
console.error(err.stack);
if (err.status) {
res.status(err.status).send(err.message);
} else {
res.status(500).send('内部サーバーエラー');
}
});
app.listen(3000, () => console.log('サーバーを起動しました。ポート: 3000'));
このコードは、次のことを行います。
express
モジュールをインポートし、Express アプリケーションを作成します。/users/:id
エンドポイントへの GET リクエストを処理するルートハンドラーを定義します。findUserById()
関数を使用して、指定された ID のユーザーを検索します。- ユーザーが見つからない場合は、
res.status(404).send('ユーザーが見つかりません')
を使用して 404 エラーを返します。 - ユーザーが見つかった場合は、
res.json(user)
を使用してユーザーデータを JSON 形式で返します。 - エラーハンドリング ミドルウェアを定義し、すべてのエラーをキャッチします。
- エラーオブジェクトに
status
プロパティがある場合は、そのプロパティを使用して適切なステータスコードを設定します。 status
プロパティが存在しない場合は、500 の内部サーバーエラーを返します。- アプリケーションをポート 3000 で起動します。
サンプル 2: エラーハンドリング ミドルウェアを使用する
const express = require('express');
const app = express();
app.get('/users/:id', async (req, res, next) => {
const userId = req.params.id;
try {
const user = await findUserById(userId);
if (!user) {
throw new Error('ユーザーが見つかりません');
}
res.json(user);
} catch (err) {
next(err);
}
});
app.use((err, req, res, next) => {
console.error(err.stack);
if (err.message === 'ユーザーが見つかりません') {
res.status(404).send(err.message);
} else {
res.status(500).send('内部サーバーエラー');
}
});
app.listen(3000, () => console.log('サーバーを起動しました。ポート: 3000'));
このコードは、サンプル 1 とほぼ同じですが、エラーハンドリング ミドルウェアを使用してエラーを処理しています。このミドルウェアは、次のことを行います。
- エラーオブジェクトの
message
プロパティをチェックして、エラーの種類を判断します。 - エラーメッセージが "ユーザーが見つかりません" の場合、404 エラーを返します。
サンプル 3: カスタム エラー クラスを使用する
const express = require('express');
const app = express();
class UserNotFoundError extends Error {
constructor(userId) {
super(`ユーザーが見つかりません: ${userId}`);
this.status = 404;
}
}
app.get('/users/:id', async (req, res, next) => {
const userId = req.params.id;
try {
const user = await findUserById(userId);
if (!user) {
throw new UserNotFoundError(userId);
}
res.json(user);
} catch (err) {
next(err);
}
});
app.use((err, req
Express.js で HTTP エラーコードを指定するその他の方法
上記で紹介した 3 つの方法に加えて、Express.js で HTTP エラーコードを指定する方法は他にもいくつかあります。
sendError() ミドルウェアを使用する
Express.js には、sendError()
という組み込みミドルウェアが用意されています。このミドルウェアは、エラーオブジェクトとオプションのステータスコードを受け取り、適切なエラー応答を返します。
const express = require('express');
const app = express();
app.get('/users/:id', async (req, res, next) => {
const userId = req.params.id;
try {
const user = await findUserById(userId);
if (!user) {
next(new Error('ユーザーが見つかりません'));
return;
}
res.json(user);
} catch (err) {
next(err);
}
});
app.use(express.sendError());
app.listen(3000, () => console.log('サーバーを起動しました。ポート: 3000'));
上記の例では、express.sendError()
ミドルウェアをアプリケーションに追加しています。このミドルウェアは、next()
関数に渡されたすべてのエラーをキャッチし、適切なエラー応答を返します。
独自のエラー レスポンダーを作成することもできます。これは、よりきめ細かなエラー処理が必要な場合に役立ちます。
const express = require('express');
const app = express();
function errorResponder(err, req, res, next) {
console.error(err.stack);
const statusCode = err.status || 500;
const errorMessage = err.message || '内部サーバーエラー';
res.status(statusCode).send(errorMessage);
}
app.get('/users/:id', async (req, res, next) => {
const userId = req.params.id;
try {
const user = await findUserById(userId);
if (!user) {
throw new Error('ユーザーが見つかりません');
}
res.json(user);
} catch (err) {
errorResponder(err, req, res, next);
}
});
app.listen(3000, () => console.log('サーバーを起動しました。ポート: 3000'));
上記の例では、errorResponder()
というカスタム エラー レスポンダーを作成しています。この関数は、エラーオブジェクト、リクエストオブジェクト、レスポンスオブジェクト、および next
関数を受け取ります。そして、エラーの詳細をコンソールに記録し、適切なステータスコードとエラーメッセージを含むエラー応答を返します。
res.json()
または res.send()
メソッドを使用して、JSON 応答またはテキスト応答を返す場合、ステータスコードをオプションとして指定できます。
app.get('/users/:id', async (req, res, next) => {
const userId = req.params.id;
try {
const user = await findUserById(userId);
if (!user) {
res.status(404).json({ message: 'ユーザーが見つかりません' });
return;
}
res.json(user);
} catch (err) {
next(err);
}
});
上記の例では、res.status(404).json({ message: 'ユーザーが見つかりません' })
を使用して、ユーザーが見つからない場合の 404 エラーを返します。
Express.js で HTTP エラーコードを指定するには、さまざまな方法があります。どの方法が最適かは、アプリケーションのニーズと要件によって異なります。
node.js express http-status-codes