I'm trying to launch my NodeJS API on a production server using Phusion Passenger. I used the last ECM syntax to import/export my modules. However when trying to reach my api, Passenger returns this error message :
Error [ERR_REQUIRE_ESM]: Must use import to load ES Module: /home/***/api/server.mjs
at Module.load (internal/modules/cjs/loader.js:948:11)
at Function.Module._load (internal/modules/cjs/loader.js:790:14)
at Module.require (internal/modules/cjs/loader.js:974:19)
at Module.require (/opt/passenger/src/helper-scripts/node-loader.js:80:25)
at require (internal/modules/cjs/helpers.js:92:18)
at loadApplication (/opt/passenger/src/helper-scripts/node-loader.js:243:2)
at setupEnvironment (/opt/passenger/src/helper-scripts/node-loader.js:214:2)
at Object.<anonymous> (/opt/passenger/src/helper-scripts/node-loader.js:133:1)
at Module._compile (internal/modules/cjs/loader.js:1085:14)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1114:10) {
code: 'ERR_REQUIRE_ESM'
I have the "type": "module"
line in my package.json and I tried to change the extension from .js to .mjs without effect.
I noticed that passenger uses CJS with "require" syntax to load my server.js as we can see here: https://github.com/phusion/passenger/blob/stable-6.0/src/helper-scripts/node-loader.js.
function loadApplication() {
var appRoot = PhusionPassenger.options.app_root || process.cwd();
var startupFile = PhusionPassenger.options.startup_file || (appRoot + '/' + 'app.js');
require(startupFile);
}
So my question is: Is there any way not to change all my code from ECM to CJS to match with Passenger?