エラーは「敵」じゃなくて「ヒント」
ここまで来ると、もうあなたは「Next.js × React でアプリを作れる人」です。
ここから先で一番“差”がつくのは、
エラーが出たときにどう向き合うか
です。
エラーが出るたびに「最悪…」で止まるのか、
「なるほど、どこがダメか教えてくれてる」と読みにいけるか。
エラーメッセージは、あなたを責める文章じゃありません。
「ここが怪しいよ」「こう直すといいよ」というヒントの塊です。
その読み方と、実務でも通用するデバッグの習慣を、ここで一気に整理します。
エラーメッセージの読み方
最初に見るべきは「一行目」と「赤い一文」
ブラウザの画面やターミナルに赤文字が出たとき、
まず目を向けてほしいのは「一番上の一行」です。
例えば、React だとこんな感じのエラーがよく出ます。
TypeError: Cannot read properties of undefined (reading 'map')ReferenceError: xxx is not definedToo many re-renders. React limits the number of renders to prevent an infinite loop.
この一行目には、だいたい次の情報が入っています。
何タイプのエラーか(TypeError / ReferenceError / SyntaxError など)
何をしようとして失敗したか(undefined の map を読もうとした、変数が定義されていない、など)
最初の一行目を“日本語に翻訳”してみる癖をつけましょう。
例:Cannot read properties of undefined (reading 'map')
→「undefined の ‘map’ プロパティを読もうとしている。つまり 〇〇.map(...) の〇〇が undefined だよ」
つぎに「どのファイルの何行目か」を探す
エラーの一行目を見たら、次にチェックするのは「場所」です。
ブラウザのエラーやターミナルには、だいたいこういう情報が出ます。
at TodoList (src/app/todos/TodoList.tsx:23:15)
ここから読み取れるのは、
どのファイルか:src/app/todos/TodoList.tsx
何行目か:23 行目付近
という情報です。
慣れてきたら、こういう流れで見ると効率がいいです。
一行目で「何系のエラーか」をざっくり掴む
ファイル名と行番号を見て、「どのコードが怪しいか」を特定
ここまでできれば、半分以上は勝ちです。
よく出るエラーと直し方のパターン
1. Cannot read properties of undefined / null
例:TypeError: Cannot read properties of undefined (reading 'map')TypeError: Cannot read properties of null (reading 'value')
これは、
「〇〇.△△ ってアクセスしようとしたけど、〇〇が undefined / null だよ」
という意味です。
よくあるパターンとしては、
todos.map(...) と書いているけど todos が undefinedevent.target.value と書いているけど event や target が想定と違う
対応するときは、次のように考えます。
「今 undefined になっているのはどの変数か?」
「その変数は、どこでどんな値が入る想定だったか?」
「初期値を入れ忘れていないか? props を渡し忘れていないか?」
React では特に、配列やオブジェクトの初期値が空のままアクセスしてしまうケースが多いので、
配列なら useState([])
オブジェクトなら useState({ ...初期値 })
のように「最低限、アクセスできる形」の初期値をセットしておくと安全です。
2. xxx is not defined
例:ReferenceError: todos is not definedReferenceError: handleClick is not defined
これは、
「その名前の変数(または関数)が、そのスコープに存在しない」
という意味です。
だいたい次のようなミスが原因です。
スペルミス(hadnleClick と書いてしまった)
宣言していない変数を使っている
別ファイルから import し忘れている
対応はシンプルで、
その名前を宣言している行があるか探す
スペルが完全に一致しているか確認する
コンポーネントを別ファイルに切り出したときは export / import を確認する
特に、props の受け取り忘れや、関数名の綴り間違いはよくあるので、
エラーを見たら「変数名のスペルチェック」を一度してみてください。
3. Too many re-renders(無限レンダリング)
例:Error: Too many re-renders. React limits the number of renders to prevent an infinite loop.
これは、
「レンダリング → state 更新 → レンダリング → state 更新…が止まらないループになっている」
というエラーです。
よくあるのは、こういうコードです。
const [count, setCount] = useState(0);
function Counter() {
setCount(count + 1); // ❌ コンポーネントの本体で setState
return <p>{count}</p>;
}
TSXまたは、さっき学んだ useEffect のところのように、
useEffect(() => {
setCount(count + 1);
}, [count]); // ❌ 自分が依存している state を自分で更新し続けている
TSX対処の考え方はこうです。
コンポーネントの本体(return の外)で setState を呼んでいないか?
useEffect の依存配列と、その中の setState の関係がループになっていないか?
state 更新は、基本的に
イベントハンドラの中(onClick, onChange など)
初回だけ実行する useEffect(依存配列 [])の中
に閉じ込めるイメージを持っておくと、無限ループはかなり減ります。
スタックトレースの見方
「エラーまでの呼び出し履歴」
エラーメッセージの下に、ずらっと
at ComponentName (xxxx.tsx:行:列)at ...
と並んでいる部分があります。これが「スタックトレース」です。
ざっくり言うと、
この関数からこの関数が呼ばれて
さらにこのコンポーネントの中でエラーになりました
という「呼び出しの履歴」です。
全部読む必要はありません。
初心者のうちは、
一番上の 2〜3 行だけ見る
で十分です。
例:
TypeError: Cannot read properties of undefined (reading 'map')at TodoList (src/app/todos/TodoList.tsx:23:15)at TodoPage (src/app/todos/page.tsx:10:5)
これを日本語にすると、
「TodoList コンポーネントの 23 行目あたりで map を読もうとしてコケた。
TodoPage から TodoList が呼ばれている」
と読み取れます。
最初に注目すべきは「自分が書いたファイル名が出ているところ」です。node_modules の中や Next.js の内部ファイルは、とりあえず無視で構いません。
自力で直す思考法
1. まず「何が起きているか」を文章にする
いきなりコードをいじる前に、
エラーメッセージを見て「状況説明」を自分の言葉でしてみてください。
例えば、
「TodoList の 23 行目で、何かの変数が undefined なのに .map している」
「LoginForm の 15 行目で email って変数を使ってるけど、その変数は宣言されてない」
といった感じです。
人間は「曖昧なまま」だと頭が止まります。
一度、自分の言葉で状況をはっきりさせることで、
どこを調べればいいかが見えてきます。
2. 「正しい状態」と「今の状態」のギャップを見る
次に考えるのは、
本来こうなっていてほしい
でも実際はこうなっている
というギャップです。
例えば undefined エラーなら、
本当は todos は配列([])であるべき
でも今は undefined になっている
なぜか?
初期値を入れていない
親コンポーネントから props を渡していない
API のレスポンスを待たずにアクセスしている
という候補が浮かびます。
「どうなっていてほしいか」をはっきりさせると、useState の初期値、props の渡し方、fetch のタイミングなど、
見るべきポイントがクリアになっていきます。
3. 「どこまで動いているか」を小さく確認する
困ったときに強いのが、「分割して確認する」やり方です。
コンソールログを入れるconsole.log("ここまできた", todos);
UI を一時的に簡単にしてみる
怪しい部分だけコメントアウトして、エラーが消えるか試す
たとえば、
todos.map(...) の前に console.log(Array.isArray(todos), todos); を入れてみると、
「本当に配列なのか」「中身は何なのか」が一発で分かります。
「どこからおかしくなっているか」の境界線を探すイメージです。
デバッグ習慣(普段から身につけたいこと)
習慣1:エラーを「ちゃんと読む」クセ
当たり前に見えるかもしれませんが、
意外と多くの人が「赤くて怖いので閉じる」「なんとなく再起動する」だけで終わらせがちです。
最低限、次の 3 つは毎回確認する習慣をつけましょう。
一行目のメッセージ(何系のエラーか)
一番上の自作ファイルのファイル名と行番号
自分の頭で日本語にする
ここまでやった上で「分からない」となったら、検索や質問に進む。
この順番を守ると、エラー対応能力が一気に上がります。
習慣2:一度に複数の場所をいじらない
バグっているときほど「あれもこれも」触りたくなりますが、
これはデバッグの世界では一番やってはいけない行動です。
修正は「できるだけ小さく、1 ステップずつ」に絞る。
何かを変えたら、その結果をすぐ確認する。
これを守らないと、
直したつもりが別の場所を壊している
どの変更が効いたのか分からない
という沼にハマります。
習慣3:再現手順を言語化する
「どういう操作をするとこのエラーが出るのか」を
自分でステップにしてみるのも重要です。
- ページを開く
- 入力欄に文字を入れる
- 追加ボタンを押す → ここでエラー
というように、再現手順を言葉にできると、
「どのタイミングの処理が怪しいか」がかなり絞れます。
実務では「バグ報告」はすべてこの「再現手順」から始まるので、
今のうちからその癖をつけておくと、現場に出たときにかなり楽です。
まとめと、ここから先の一歩
ここまでのポイントをまとめると、
エラーメッセージは「敵」ではなく、「どこが怪しいかを教えてくれるヒント」。まずは一行目とファイル名・行番号を見る。
よく出るエラー(undefined のプロパティ読み、変数未定義、無限レンダリング)はパターンで覚え、「何をしようとして失敗しているのか」を日本語にする。
スタックトレースは全部読む必要はなく、「自分が書いたファイルが最初に出てくる場所」だけを注目して見る。
自力で直すには「状況説明 → 期待する状態とのギャップ → どこまで動いているかの確認」という順番で考え、コンソールログや一時的なコメントアウトで境界線を探す。
デバッグ習慣として、「エラーをちゃんと読む」「一度にたくさんいじらない」「再現手順と言語化」を普段から意識しておくと、実務レベルに近いデバッグ力になる。
もし今、「最近出たエラーでまだモヤモヤしているやつ」があれば、
そのエラーメッセージと状況をそのまま書いてみてください。
それを一緒に分解しながら読んでいくと、
この記事で話した「読み方・考え方」が、一気に“自分の武器”として定着していきます。

