Expressの冗長なエラー処理を簡潔にする
Expressの冗長なエラー処理を簡潔にする:
初投稿です。
今までExpressのエラー処理は以下のように書いてました。
(例:必須のリクエストパラメータのチェック)
パラメータの個数分、同様の処理を書いていて冗長だなぁと感じていました。
Express でのエラー処理にエラーハンドリングの方法が書いてありました。
err, req, res, nextの4つの引数を持つミドルウェア関数を定義して、全てのミドルウェアの最後で呼び出します。
logErrors関数はエラーのログを出力します。
errorHandler関数はクライアントにエラーレスポンスを返します。
そして、エラーを投げる側ではnext関数にエラーオブジェクトを渡します。
これでエラーログ出力とエラーレスポンス返却をエラー処理ミドルウェアに任せることができました。
しかし、今のままではerrorHandlerで常にステータスコードが500のエラーレスポンスが返されてしまいます。なので、ちょっと変えます。
これでステータスコードが400のエラーレスポンスを返せるようになります。
毎回、エラーオブジェクトにステータスコードを設定するのは面倒臭いです。
CustomErrorクラスかboomを導入すると、ステータスコードの設定が簡潔になります。
ワンライナーで書けました。
hapijs/boom
boomはHTTPのエラーオブジェクト返すモジュール群です。
上のコードは以下のオブジェクトを返します。
コードを見ればどんなエラーかわかるのでいいですね。
badRequestの他にもunauthorizedやnotFoundなど基本的なエラーが揃っています。
boomを使って書くと、こうなります。
初投稿です。
今までExpressのエラー処理は以下のように書いてました。
(例:必須のリクエストパラメータのチェック)
const { username } = req.body;
if (!username) {
const err = new Error('username is required');
console.log(err);
res.status(400).send({ error: err });
}
エラー処理ミドルウェア関数
Express でのエラー処理にエラーハンドリングの方法が書いてありました。err, req, res, nextの4つの引数を持つミドルウェア関数を定義して、全てのミドルウェアの最後で呼び出します。
function logErrors(err, req, res, next) {
console.error(err.stack);
next(err);
}
function errorHandler(err, req, res, next) {
res.status(500);
res.send({ error: err });
}
app.use(logErrors);
app.use(errorHandler);
errorHandler関数はクライアントにエラーレスポンスを返します。
そして、エラーを投げる側ではnext関数にエラーオブジェクトを渡します。
const { username } = req.body;
if (!username) {
const err = new Error('username is required');
next(err);
}
しかし、今のままではerrorHandlerで常にステータスコードが500のエラーレスポンスが返されてしまいます。なので、ちょっと変えます。
function errorHandler(err, req, res, next) {
res.status(err.statusCode || 500);
res.send({ error: err });
}
const { username } = req.body;
if (!username) {
const err = new Error('username is required');
err.statusCode = 400;
next(err);
}
ステータスコードの設定
毎回、エラーオブジェクトにステータスコードを設定するのは面倒臭いです。CustomErrorクラスかboomを導入すると、ステータスコードの設定が簡潔になります。
CustomErrorクラス
class CustomError extends Error {
constructor(message, statusCode) {
super(message);
this.statusCode = statusCode;
}
}
if (!username) next(new CustomError('username is required', 400));
boom
hapijs/boomboomはHTTPのエラーオブジェクト返すモジュール群です。
Boom.badRequest('invalid query')
{
"statusCode": 400,
"error": "Bad Request",
"message": "invalid query"
}
badRequestの他にもunauthorizedやnotFoundなど基本的なエラーが揃っています。
boomを使って書くと、こうなります。
if (!username) next(Boom.badRequest('username is required'));
まとめ
- エラーミドルウェア関数を用いることで、エラーログ出力とエラーレスポンスの返却処理を共通化することができました
- CustomErrorクラス(またはboom)を用いることで、ステータスコードの設定が簡単になりました
コメント
コメントを投稿