I'm caught in a bit of a loop trying to deploy my app to Heroku. My import statements (e.g. import cors from 'cors'
) seem to prevent the app from launching in production, due to the "Cannot Load ES6 Modules in Common JS" error. Locally it runs just fine.
However, when I attempt to resolve the above error by adding "type": "module"
to my package.json
I get a whole new set of errors and the app will no longer run locally. I believe this error is due to the way I'm initializing sequelize and associated models but I am unsure. I'd like to resolve this error but need a hand with new syntax for the imports... I think.
Error, package.json
and index.js
include below.
Error Text
[nodemon] starting `babel-node src/index.js`
internal/process/esm_loader.js:74
internalBinding('errors').triggerUncaughtException(
^
Error [ERR_UNSUPPORTED_DIR_IMPORT]: Directory import '/Users/jeff/Clients/Bummer/Code/Server/src/models' is not supported resolving ES modules imported from /Users/jeff/Clients/Bummer/Code/Server/src/index.js
at finalizeResolution (internal/modules/esm/resolve.js:272:17)
at moduleResolve (internal/modules/esm/resolve.js:699:10)
at Loader.defaultResolve [as _resolve] (internal/modules/esm/resolve.js:810:11)
at Loader.resolve (internal/modules/esm/loader.js:85:40)
at Loader.getModuleJob (internal/modules/esm/loader.js:229:28)
at ModuleWrap.<anonymous> (internal/modules/esm/module_job.js:51:40)
at link (internal/modules/esm/module_job.js:50:36) {
code: 'ERR_UNSUPPORTED_DIR_IMPORT',
url: 'file:///Users/jeff/Clients/Bummer/Code/Server/src/models'
}
[nodemon] app crashed - waiting for file changes before starting...
Package.JSON
{
"name": "bummer",
"type": "module",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"start": "node src/index.js",
"dev": "nodemon --exec babel-node src/index.js",
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"@babel/core": "^7.9.6",
"@babel/node": "^7.8.7",
"@babel/preset-env": "^7.9.6",
"nodemon": "^2.0.4",
"sequelize-cli": "^6.2.0"
},
"dependencies": {
"cookie-parser": "^1.4.5",
"cors": "^2.8.5",
"dotenv": "^8.2.0",
"express": "^4.17.1",
"pg": "^8.2.1",
"querystring": "^0.2.0",
"request": "^2.88.2",
"sequelize": "^6.3.5",
"sequelize-auto-migrations": "^1.0.3",
"uuid": "^8.0.0"
}
}
Index.js
import cors from 'cors';
import express from 'express';
import models, { sequelize } from './models';
// import routes from './routes';
//Initiaze Express
const app = express();
const routes = require('./routes');
//Helpers for Spotify oAuth
const cookieParser = require('cookie-parser')
// Include Middleware
app.use(express.static(__dirname + '/public'))
.use(cors())
.use(cookieParser())
.use(express.json())
.use(express.urlencoded({ extended: true }))
require('dotenv').config()
// Include all Models
app.use((req, res, next) => {
req.context = {
models,
};
next();
});
// Load Routes from Router Index
app.use('/', routes);
sequelize.sync().then(() => {
app.listen(process.env.PORT, () => {
console.log(`Example app listening on port ${process.env.PORT}!`)
});
});
Thoughts or pointers? Thank you!
In Node.js, import statements are permitted only in ES modules. so, directory imports do not work in Node.js. Read Node.js Documentation. Show activity on this post.
The "Error [ERR_UNSUPPORTED_DIR_IMPORT]: Directory import is not supported" occurs in Node.js, when we try to use a directory import. To solve the error, explicitly specify the index.js filename in the import or use the --experimental-specifier-resolution flag. Here is an example of how the error occurs.
The "Error [ERR_UNSUPPORTED_DIR_IMPORT]: Directory import is not supported" occurs in Node.js, when we try to use a directory import. To solve the error, explicitly specify the index.js filename in the import or use the --experimental-specifier-resolution flag. Here is an example of how the error occurs. This is a file called index.js. Copied!
What happens here is that Node mandates using an extension in import statements and also states, Directory indexes (e.g. './startup/index.js') must also be fully specified. Your import database from './database'; statement doesn't specify the index.js.
index.js
). E. g.import ... from './models' // ❌
import ... from './models/index.js' // ✅
Use --experimental-specifier-resolution=node
flag. For example:
node --experimental-specifier-resolution=node main.js
See: https://nodejs.org/api/esm.html#esm_customizing_esm_specifier_resolution_algorithm
In Node.js, import statements are permitted only in ES modules. so, directory imports do not work in Node.js. Read Node.js Documentation.
Try adding the --experimental-specifier-resolution=node
flag to your start
script in package.json
, particularly if you're using this flag when running locally - this is the script Heroku will use to start your server.
scripts": {
"start": "node --experimental-specifier-resolution=node index",
...
},
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With