Express.jsでエラーメッセージを隠す方法

今日連休が終わりました。正月太ってしまったのでダイエットも今年の目標に追加ですね。
もちろん一番の目標はJavaScriptのスキルアップです!

Express.jsでエラーメッセージを隠す方法

Express.jsのエラーメッセージ

参考にしたのはExpress.js公式ページです。

Webアプリケーションを公開する際に不要なエラーメッセージを出力すると攻撃者に情報を与えてしまうため、セキュリティ上望ましくありません。

なのでエラーメッセージを隠します。基本的にはExpress.jsの機能でエラーハンドリングはできます。

Express.jsの404エラーでこんな感じです。

Not Found
404
NotFoundError: Not Found
    at /Users/xxx/Desktop/test/app.js:27:8
    at Layer.handle [as handle_request] (/Users/xxx/Desktop/test/node_modules/express/lib/router/layer.js:95:5)
    at trim_prefix (/Users/xxx/Desktop/test/node_modules/express/lib/router/index.js:317:13)
    at /Users/xxx/Desktop/test/node_modules/express/lib/router/index.js:284:7
    at Function.process_params (/Users/xxx/Desktop/test/node_modules/express/lib/router/index.js:335:12)
    at next (/Users/xxx/Desktop/test/node_modules/express/lib/router/index.js:275:10)
    at /Users/xxx/Desktop/test/node_modules/express/lib/router/index.js:635:15
    at next (/Users/xxx/Desktop/test/node_modules/express/lib/router/index.js:260:14)
    at Function.handle (/Users/xxx/Desktop/test/node_modules/express/lib/router/index.js:174:3)
    at router (/Users/xxx/Desktop/test/node_modules/express/lib/router/index.js:47:12)

デフォルトのapp.jsでは404エラーを生成してデフォルトのError画面に遷移します。Node.jsって即バレですね。

productionモードの設定

EJSのerror.statusおよびerror.stackが出力されるのはNODE_ENVがdevelopmentの場合のみで、productionに設定しておけばエラーは表示されません。
公式ページにも書いてありました。

公式から抜粋↓

Set the environment variable NODE_ENV to production, to run the app in production mode.

私はpackage.jsonのscripts.startにNODE_ENV=productionを設定しました。
nodeのところをnodemonやforever startを使用していても動きます。

package.json
"scripts": {
  "start": "NODE_ENV=production node ./bin/www"
},

404エラー

404エラーはわかりやすく表示させたいとかの場合は、ステータス404、メッセージを設定して新規画面を設定することもできます。

ExpressのFAQによると404はエラーではなく、ミドルウェアの機能として実行されるようです。
ルーティングできなかった扱い。そのため、errorやmessageは自分で設定します。

修正前

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  next(createError(404));
});

修正後

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  res.status(404);
  res.locals.error = {};
  res.render('error', {message: "404: The page was not found"});
});

最後に

ここまでで(というかほぼデフォルト設定)で変なエラーを出してしまうことはなくなるのではないかと。
ただ、コーディングの際にファイル名がないなど変なエラーを出してしまうとフォルダ構成が出てしまったりするので、そこはきちんと処理するようにしましょう。