LoginSignup
11
9

More than 3 years have passed since last update.

javascript「Uncaught TypeError: 〜〜 is not a function」エラー解決時、意外な敵の暗躍に苦しんだ話

Last updated at Posted at 2020-03-11

ミナミ(@minami_nakasato)です。

エラーに苦しんだので記録します。

エラー内容

アプリ開発中、「hoge.js」ファイルを用意し、その中で関数を定義。

そして「application.js」で読み込む。

しかし、関数が動かないエラーが発生。

javascriptのエラーとしてはポピュラーな

「Uncaught TypeError: オブジェクト.メソッド名 is not a function」

「Uncaught TypeError: Cannot read property ‘プロパティ名’ of undefined」

の登場だ。

step1

「hoge.js」ファイル内に

console.log("fuga");

を記述し、chrome検証ツールのconsoleタブで確認。

ちゃんと「fuga」が表示されている。

という事はjsファイル自体は読み込まれている。

該当の関数だけが読み込まれない状況のようだ。

step2

引き続き、検証ツールで

Sourcesタブ → Pageタブ

をクリック。

読み込まれているファイルの一覧が表示されるので、問題のjsファイルAを確認。

すると、

ファイル名はAなのに、読み込まれた時点では中身のコードが全く関係ないファイルBの内容になっている。

そのため適切な関数が読み込まれずに今回のエラーになった。

「パッケージは日清カップヌードルなのに、中身はぺヤングカップ焼きそばでビックリ」

という状態だ。

こんなエラー初めて見た。

step3

日清カップヌードルの中身を追い出しコッソリ侵入した強盗ぺヤングこと「ファイルB」で検索をかけてみた。

$ git grep [ファイルB]

当然、該当のファイルはヒットした。

しかしエラーの原因を突き止める手がかりは無し。

step4

「プレーンなgrepコマンドを使って、git管理下にないファイルも検索してみよう」

$ grep -r [ファイルB]

「-r」オプションで再帰的に処理。

すると

tmp/cache/assets/sprockets/v3.0/~hoge~.cache

なるファイルがヒット。こいつの仕業か。。?

step5

不要なログファイル、一時ファイルは削除するに限る
(汚物は消毒だ!)

以下のコマンドを実行した。

rails cache:clear

それから

rails tmp:clear

も実行。

すると無事に解決!

ファイル名も中身もAの内容が反映され、無事にjsの関数を動かす事ができました。

※ブラウザのキャッシュクリアも試す価値あり。
chromeであれば

設定 > プライバシーとセキュリティ > 閲覧履歴データの削除 > キャッシュされた画像とファイル (他はチェックしない)

※また、シークレットモードではうまく動作しないかも確認する

教訓

①検索時に「git grep」だけやるクセがあったが、git管理下にないファイルがエラーの原因になることもあるので、「grep」での検索も怠らない

②tmpファイルがエラーの温床になる例があると分かった。
今後は定期的に削除する。意味不明なエラー発生時は、それらに原因がないか疑う。

======================================
ミナミ(@minami_nakasato)です。都内のベンチャー企業でwebデザイン/プログラミング/動画撮影や編集などをやっています。

11
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
9