PM2 with ES module. Error: ERR_REQUIRE_ESM
Asked Answered
W

2

7

My package.json file looks something like this:

{
...
  "main": "index.js",
  "type": "module",
  "scripts": {
    "devStart": "pm2 start ecosystem.config.js --env dev --watch",
    "prodStart": "pm2 start ecosystem.config.js --env prod --watch",
    "reload": "pm2 reload ecosystem.config.js",
    "stop": "pm2 stop ecosystem.config.js",
    "end": "pm2 delete ecosystem.config.js"
  },
...
}

I have activated ES modules by "type": "module", as you see.

And the ecosystem.config.js file:

module.exports = {
  apps : [{
    name   : "app1",
    script : "./app.js",
    env_production: {
       NODE_ENV: "production"
    },
    env_development: {
       NODE_ENV: "development"
    }
  }]
}

So, when I run the script npm run devStart an error occurs.

File ecosystem.config.js malformated

code: 'ERR_REQUIRE_ESM'

It works when I just remove the "type": "module" part from config file.

How can I solve this?

node -v : v16.13.0

pm2 -v : 5.1.2

Wicketkeeper answered 25/11, 2021 at 17:46 Comment(3)
What does your importing module syntax look like?Murther
It's old style importing there require(). It seems PM2 doesn't support ES Modules yet. But I find a temporary solution for this, here: github.com/nodejs/modules/issues/293Kommunarsk
You will have very limited success, if any, mixing and matching module formats. You should stick with CommonJS.Murther
W
15

Rename ecosystem.config.js to ecosystem.config.cjs

Woad answered 22/9, 2022 at 9:51 Comment(3)
Then I get: [PM2][ERROR] File ecosystem.config.js not foundCanty
@Canty include config's filename in the command line: pm2 start ecosystem.config.cjsJarrett
The solution from t-bee worked for me!Dentiform
L
2

I guess that the better way to avoid this error is creating the ecosystem.config.js outside the app directory that PM2 couldn't see the package.json file. I could run my ecosystem.config only use this way and also fixed a path for running script. Example :

module.exports = { 
 apps : [{
    name   : "nuxt3_app",
    script : "myApp/.output/server/index.mjs",
    interpreter: "node",
    env: {
       DATABASE_URL: "mysql://root:root@localhost:3306/db"
    },

  }]
}
Libelee answered 5/1 at 14:24 Comment(1)
This helped me, I was able to run after this solution.Ridings

© 2022 - 2024 — McMap. All rights reserved.