TypeORM で SyntaxError: Cannot use import statement outside a module エラーが発生した話

2022.08.04

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

私が担当している案件では、Typescript, experss, TypeORM を使って開発しています。 先日、tscコマンドした後にnodeコマンドで実行したところ以下のようなエラーが出ました。

SyntaxError: Cannot use import statement outside a module

ネットでこのエラーを検索するとモジュールシステムをcommonjsにしているのが原因なのでES Modulesに変えるとよい、という記事があったので、package.jsonに "type": "module"を追加してみたのですが解決しませんでした。

困っていたところ同僚に TSファイルをnodeコマンドで実行しようとした際も同じエラーが出ることを教えてもらいました。調査したところ、TypeORM の設定ファイルであるormconfig.tsに原因があることが分かりました。entitiesの部分でtsファイルを指定しているところです。

module.exports = {
  type: "postgres",
  host: process.env.DB_HOST,
  port: process.env.DB_PORT,
  username: process.env.DB_USER_NAME,
  password: process.env.DB_PASSWORD,
  database: process.env.DB_DATABASE,

  synchronize: false,
  entities: ["src/entity/*.ts"],
};

ormconfig.tsを以下のように変更したところエラーがなくなりました。ローカルで開発している時はts-nodeで実行しているので*.tsを読み込みます。サーバにデプロイする時はトランスパイルした Javasciript を実行するので*.jsに変えています。

module.exports = {
  type: "postgres",
  host: process.env.DB_HOST,
  port: process.env.DB_PORT,
  username: process.env.DB_USER_NAME,
  password: process.env.DB_PASSWORD,
  database: process.env.DB_DATABASE,

  synchronize: false,
  entities: [`src/entity/*.${process.env.ENV === "local" ? "ts" : "js"}`],
};