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:
3Error [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
5 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.