简体   繁体   中英

'Directory import is not supported resolving ES modules' with Node.js

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

With ES6 modules you can not (yet?) import directories. Your import should look like this:

import database from "./database/index.js"

What happens here is that Node mandates using an extension in import statements and also states,

Directory indexes (eg './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 .

You 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. 

TValidator'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.

With ES6 modules you can not (yet?) import directories.

Here you can see I made this changes and it worked for me this are my two files below and I needed to write require to import user for it but in ES6 it doesn't support require so in my solution I created the export default of users and it comes with sequelize and datatypes values so now I created import of users above in index.js file so I can use those values without using require.

Also you have to add (.js) extension in the imported files path just like I did in index.js files second line.

Your import should look like this:

Index.js

import { DataTypes, Sequelize } from "sequelize";
**import Users from "./users.js";**

const sequelize = new Sequelize("Users", "root", "", {
  host: "localhost",
  dialect: "mysql",
  pool: { max: 5, min: 0, idle: 10000 },
});
sequelize
  .authenticate()
  .then(() => {
    console.log("Connected !");
  })
  .catch((err) => {
    console.log("Error", err);
  });

const db = {};

db.sequelize = Sequelize;
db.sequelize = sequelize;

**db.users = Users(sequelize, DataTypes);**

db.sequelize.sync().then(() => {
  console.log("YES Re-Sync !");
});

export default sequelize;

Users.js

const Users = (sequelize, DataTypes) => {
sequelize.define(
"Users",
{
  name: {
    type: DataTypes.STRING,
  },
  email: {
    type: DataTypes.STRING,
    defaultValue: "kishandobariyadk7301@gmail.com",
  },
  gender: {
    type: DataTypes.STRING,
  },
},
{
  // timestamps: false,
  // updatedAt: false,
  // createdAt: false,
  // createdAt: created_at,
  // updatedAt: modified_at,
  // engine: "Kishan",
}
`);
};


export default Users;

根据 nodejs文档,目录导入不起作用

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM