
I'm using Node.js v14.13.0.
app.js file:
import database from './database'; database();
database/index.js file:
import mongoose from 'mongoose'; export default connect = async () => { try { await mongoose.connect('...', { }); } catch (error) {} };
In package.json I added "type": "module"
.
After running the app I get the following error:
Error [ERR_UNSUPPORTED_DIR_IMPORT]: Directory import '/Users/xx/Desktop/Projects/node-starter/src/database' is not supported resolving ES modules imported from /Users/xx/Desktop/Projects/node-starter/src/app.js
35 Answers
With ES6 modules you can not (yet?) import directories. Your import should look like this:
import database from "./database/index.js"
1What 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
. You can add index.js
as suggested in another answer, but that approach doesn't look elegant in TypeScript projects, when you'd end up importing a .js
file from a .ts
one.
You can change this Node extension resolution behavior by passing the --experimental-specifier-resolution=node
flag. This will work and will keep your code unchanged:
app.js
import database from './database'; database();
Run as: node --experimental-specifier-resolution=node app.js
.
A Node developer admitted that the documentation wasn't that clear.
According to nodejs documentation, directory imports doesn't work
1You can use babel. I used following babel library in node project and every ES6 features work properly.
"devDependencies": { "babel-cli": "^6.26.0", "babel-plugin-transform-class-properties": "^6.24.1", "babel-preset-env": "^1.6.1" }
Although it may be old version but you can use latest version.
7TValidator's answer is somewhat right, you can use babel to resolve this issue.
However, you must install @babel/core, @babel/node, @babel/preset-env.
And, you must make babel.config.json like belows;
{ "presets": ["@babel/preset-env"] }
You should stay babel.config.json in the root folder of your project.
Now, you don't have to set "type": "module" to the package.json.
ncG1vNJzZmirpJawrLvVnqmfpJ%2Bse6S7zGiorp2jqbawutJobW1sZWiFdoWOnaCrnZOpvLPFjKKkqaeiqXqqv4ynpq1lo6q9sbvRrZydZaKawLC41aKloGWVqHquu8Ouo56rXay2tbSMp6adnV2fwA%3D%3D