TypeORMを使用してMySQLデータベースからデータを取得(`EntityManager.find`)しようとしたところ、以下のスタックトレースを含むエラーが発生しました。
`SyntaxError: Unexpected strict mode reserved word at compileSourceTextModule...`
(中略)
`at tryToRequire (/app/node_modules/typeorm/util/ImportUtils.js)`
`TypeORMError: Connection is not established with mysql database`
このエラーの根本的な原因として、最も可能性が高いものはどれですか?
解説
正解は「TypeORMが内部でMySQLの接続用パッケージ(mysqlやmysql2)を読み込む際、CommonJSとES Modulesの互換性問題によりJSの構文エラーが発生したため」です。スタックトレースをよく見ると、Connection is not established(接続が確立されていない)というTypeORMのエラーの前に、SyntaxError(JavaScriptの構文エラー)が発生しています。ログの loadESMFromCJS や tryToRequire という記述から、TypeORMが依存するMySQLドライバーのパッケージを読み込もうとしたものの、モジュール解決の仕組み(CommonJSからES Modulesを読み込もうとした際の不整合)が原因でJavaScriptのコード自体が解釈できず、結果としてDB接続すら試みられていないことがわかります。したがって、パスワード間違いやサーバー停止などの通信関連の選択肢はすべて不正解となります。エラーログは「真犯人」から読み解く初学者のうちは Connection is not established... という一番下の分かりやすいエラーメッセージに飛びついてしまいがちです。しかし、複数のエラーが連鎖しているスタックトレースでは、一番最初に発生したエラー(ログの上部にあるエラー)が根本原因であることがほとんどです。今回のログの核心部分はここです。Database connection error: SyntaxError: Unexpected strict mode reserved word
at compileSourceTextModule
...(中略)...
at loadESMFromCJS
...(中略)...
at tryToRequire (/app/node_modules/typeorm/util/ImportUtils.js:21:17)TypeORMは、使用するデータベース(MySQLやPostgreSQLなど)に応じて、対応するドライバを動的に require() します。しかし、最近のNode.jsエコシステムでは、パッケージが従来の CommonJS (CJS) から新しい ES Modules (ESM) へと移行しつつあります。この過渡期において、CJS環境からESMのみをサポートするバージョンのパッケージ(例えば mysql2 の最新版など)を無理に require() しようとすると、ESM特有の構文(トップレベルの await や export など)が「strict modeの予約語の不正使用」として認識され、SyntaxError で落ちてしまうのです。CJSとESMの非互換エラーをどう解決するか実務でこのようなモジュール周りのエラーに遭遇した場合、プロは以下のようなアプローチで解決を図ります。パッケージのバージョンを下げる: 問題となっているドライバー(例: mysql2)のバージョンを、CommonJSをサポートしていた一つ前のメジャーバージョンにダウングレードする。プロジェクト全体をESMに移行する: package.json に "type": "module" を追記し、TypeORMの設定ファイルやコード全体を import/export 構文に統一する。Node.jsのバージョンを確認する: 最新のNode.jsではCJSからのESM読み込みのサポートが改善されている場合があるため、LTS(長期サポート版)の最新版にアップデートする。「DBに繋がらないからパスワードを確認する」のではなく、「そもそもコードが正しく動いているか」をログから見極める力が、エンジニアとしてのレベルアップに直結します。