📖

[Nestjs] ERR_REQUIRE_ESMのエラーで起動しない

2025/02/09に公開

問題

Nestjsで構築したバックエンドのAPIサーバー、起動するとこのエラーが発生

[4:48:55 AM] Starting compilation in watch mode...
backend-1  |
backend-1  | [4:49:10 AM] Found 0 errors. Watching for file changes.
backend-1  |
backend-1  | /app/dist/modules/auth/services/github.service.js:16
backend-1  | const rest_1 = require("@octokit/rest");
backend-1  |                ^
backend-1  |
backend-1  | Error [ERR_REQUIRE_ESM]: require() of ES Module /app/node_modules/@octokit/rest/dist-src/index.js from /app/dist/modules/auth/services/github.service.js not supported.
backend-1  | Instead change the require of index.js in /app/dist/modules/auth/services/github.service.js to a dynamic import() which is available in all CommonJS modules.
backend-1  |     at Object.<anonymous> (/app/dist/modules/auth/services/github.service.js:16:16) {
backend-1  |   code: 'ERR_REQUIRE_ESM'
backend-1  | }
backend-1  |
backend-1  | Node.js v20.10.0

解決策

package-jsonのスクリプトにNODE_OPTIONS='--experimental-require-module' をつけることで起動するようになたよ

以下の記事が参考になった
https://zenn.dev/ptna/articles/28b20f303a3cfb

ただやっぱり実験的な機能だと思うので、使用するのはどうなのかな、、

このオプションは何ができるのか(By ChatGpt)

ESM の読み込みが可能になる
このオプションを付けて Node.js を起動すると、たとえば拡張子が .mjs または特定の設定が施されたファイルでも、require() を使って読み込むことができるようになります。内部的には、Node.js は動的な import() を使って ESM モジュールを読み込み、その結果(たとえば default エクスポート)を CommonJS 側に変換して返します。

既存の CommonJS コードとの互換性向上
すでに大量の CommonJS ベースのコードがあるプロジェクトで、今後 ESM 化されたライブラリを利用したい場合、--experimental-require-module を利用することで、コード全体を ESM へ書き換えなくても、require() 経由で ESM モジュールを扱えるようになります。

解消までにやったこと

まずはDockerの立てていたNodeサーバーのイメージのバージョンが20だったので、23までバージョンアップを実行。
すると以下のエラーが、、
どうもNodeのデフォルトのバージョンが3系ではなく1系になっているみたい。(この辺よくわかってない)

backend 6/9] RUN yarn install --production=false:
0.366 error This project's package.json defines "packageManager": "yarn@3.2.2". However the current global version of Yarn is 1.22.22.
0.366
0.366 Presence of the "packageManager" field indicates that the project is meant to be used with Corepack, a tool included by default with all official

どうにも解消できなかったので、package.jsonで指定していたYarnのバージョン指定を解除してデフォルトのバージョンを使わせるようにした。

package.json
-"packageManager": "yarn@3.2.2"

package.jsonにNODE_OPTIONS='--experimental-require-module'を指定し起動するとエラーは消えた。

  "scripts": {
    "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
    "start": "NODE_OPTIONS='--experimental-require-module' nest start",
    "start:dev": "NODE_OPTIONS='--experimental-require-module' nest start --watch -r tsconfig-paths/register",
    "start:debug": "NODE_OPTIONS='--experimental-require-module' nest start --debug --watch",
    "start:prod": "node dist/main",
    "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
    "test": "jest",
    "test:watch": "jest --watch",
    "test:cov": "jest --coverage",
    "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand",
    "test:e2e": "jest --config ./test/jest-e2e.json",
    "clean": "rimraf dist/",
    "prisma:generate": "prisma generate --schema=./prisma-postgres/schema.prisma && prisma generate --schema=./prisma-mongodb/schema.prisma",
    "prisma:seed": "ts-node ./prisma-postgres/seed.ts && ts-node ./prisma-mongodb/seed.ts",
    "build": "NODE_OPTIONS='--experimental-require-module' yarn clean && nest build"
  },

Discussion