logo
  • 現在做什麼
  • 關於我

Kalan

文章分類

  • 前端
  • 開發筆記
  • 雜談
  • 年度回顧

快速連結

  • 現在做什麼
  • 關於我
  • 聯絡我
  • 職涯思考🔗

關注我

在福岡生活的開發者,分享軟體開發與日本生活的點點滴滴。

© 2025 Kalan Made with ❤️. All rights reserved.

ベターエクスプレスエラー

作成者:カランカラン2017年11月10日 9:00
ホーム/開発ノート
💡

質問やフィードバックがありましたら、フォームからお願いします

英語原文

目次

  1. Better-express-error
    1. エラーメッセージの分析
  2. エラーの表示
  3. ファイルの内容を表示
  4. REPL
  5. 全部統合!
  6. 結論

本文は台湾華語で、ChatGPT で翻訳している記事なので、不確かな部分や間違いがあるかもしれません。ご了承ください

Better-express-error

express 開発中にエラーが発生した場合、通常はエラーページに直接表示されるか、プロダクション環境では404や500ページにリダイレクトされます。

これは特に珍しいことではありませんが、正直なところ、こんなページを見たら嬉しいですか?

default error

Ruby on Rails 開発に慣れているエンジニアであれば、多少なりとも better_errors や Rails に内蔵されているエラートレースページを使ったことがあるでしょう。

しかし、express には better error に類似したパッケージを見たことがなく、しばしばこのような醜いエラーメッセージを見上げることになります。

そこで、簡単なミドルウェアを作成してこの問題を解決しました。実質的には、better errors の express 実装です。

エラーメッセージの分析

TypeError: range out of bound. Please check http://kjj6198.github.io for more information.
at app.get (/Users/kalan/code/express-error/server/app.js:17:9)
at Layer.handle [as handle_request] (/Users/kalan/code/express-error/node_modules/express/lib/router/layer.js:95:5)
at next (/Users/kalan/code/express-error/node_modules/express/lib/router/route.js:137:13)
at Route.dispatch (/Users/kalan/code/express-error/node_modules/express/lib/router/route.js:112:3)
at Layer.handle [as handle_request] (/Users/kalan/code/express-error/node_modules/express/lib/router/layer.js:95:5)
at /Users/kalan/code/express-error/node_modules/express/lib/router/index.js:281:22
at Function.process_params (/Users/kalan/code/express-error/node_modules/express/lib/router/index.js:335:12)
at next (/Users/kalan/code/express-error/node_modules/express/lib/router/index.js:275:10)
at jsonParser (/Users/kalan/code/express-error/node_modules/body-parser/lib/types/json.js:109:7)
at Layer.handle [as handle_request] (/Users/kalan/code/express-error/node_modules/express/lib/router/layer.js:95:5)

よく観察すると、エラーメッセージのフォーマットは非常に規則的です。まず、最初の行はエラーの名前とメッセージで、通常は最も重要な情報です。2 行目以降はスタックトレースです。at … は特定の関数の呼び出しを示し、カッコ内にはファイル名と行数、行の情報が含まれています。

エラーメッセージを簡単に分析した後、純粋なテキストをより有用な情報に変換できます。split('\n') を使用し、文字列に基づいて簡単な正規表現マッチングを行うことで、ファイル名と行数を分けることができます。

エラーの表示

最初の行のエラーメッセージは通常、最も重要な情報です。なぜなら、プログラムがそこでエラーを吐き出しているからです。したがって、最初の行のエラーメッセージは目立つ場所に配置し、ハイライトします。

better error(1)

2 行目以降のエラーメッセージは、色とサイズを使ってファイル名、行数、および呼び出される関数名を示します。

better error(2)

前のような一塊の黒い文字と比べて、こうしたシンプルな整理によって、開発者は何が起こったのかを一目で理解できるようになります。

ファイルの内容を表示

しかし、エラーメッセージを表示するだけではなく、対応するファイルの内容や文脈も同時に表示したいと思います。そのため、右側にはエラーメッセージ中のファイル名と行数を利用して、対応するファイルの内容を表示します。

Node.js に関しては、fs.readFileSync を使えば十分です。

function(filename, line, row) {
  const content = fs.readFileSync(filename);
  content.toString()
  	.split('\n')
  	.slice(line - 5, line + 5)
  	.map(content => `<span>${content}</span>`)
  	.join('\n');
}

ここでは非常にシンプルな方法で、前後5行を直接表示しています。より賢い方法としては、AST などの技術を用いて、該当する関数の内容のみを表示することもできますが、今回は前後5行のコードをそのまま表示します。

いくつかの調整と修正を加えた結果は、こんな感じです:

better error(3)

シンプルなハイライトを通じて、開発者がエラーの場所を即座に把握できるようになります。

REPL

エラーを表示するだけでなく、このページに簡単なプログラムを入力できる機能も追加したいと考えています。問題点を確認した後、実際にコードを修正するためです。

Node.js には、VM モジュールがあり、これを使うことで V8 のバーチャルマシンコンテキストで指定されたコードを実行できます。このモジュールを使えば、REPL のような機能を実現できます!

const debugContext = vm.createContext({
  request: req,
  response: res,
  util: require("util"),
  Buffer: require("buffer").Buffer,
  stream: require("stream"),
  console: {
    log: util.format,
  },
  clear: "",
})

公開したい変数をコンテキストに渡し、POST メソッドでフロントエンドのコードを読み取ることで、デバッグが非常に便利になります。

better error(4)

(ここではさらに調整が必要です)

全部統合!

better error(5)

すべてを統合した結果、ページはこのようになります。

元の純粋なテキストに比べて、ページのスタイルを調整し、REPL 機能を実装するためにいくらかの手間がかかりましたが、デバッグのプロセスをよりスムーズにしました。

結論

express-error

詳細な実装はこのリポジトリにあります。最近少し時間があれば、実装をミドルウェアの形式に抽象化して、皆さんが使いやすくする予定です。また、全体のレイアウトやコードハイライトの部分を徐々に最適化し、プロセスと画面をよりスムーズにしていきます。どれくらいの時間がかかるかはわかりませんが、XD

さまざまな提案があれば、issue を提出してください。

← リアクト16 ハイライトカーニバルダブル 11 — ハッピーバースデートゥミー →

この記事が役に立ったと思ったら、下のリンクからコーヒーを奢ってくれると嬉しいです ☕ 私の普通の一日が輝かしいものになります ✨

☕Buy me a coffee

目次

  1. Better-express-error
    1. エラーメッセージの分析
  2. エラーの表示
  3. ファイルの内容を表示
  4. REPL
  5. 全部統合!
  6. 結論