Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Error [ERR_UNSUPPORTED_DIR_IMPORT]: Directory import when attempting to start Nodejs App locally

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!

like image 625
brickandbone Avatar asked Oct 20 '20 16:10

brickandbone


People also ask

Is it possible to import directory in Node JS?

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.

How to fix [err_unsupported_Dir_import] error in Node JS?

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.

How to solve the error [Err_unsupported_Dir_import] Directory import is not supported?

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 when using extension in import statements in node?

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.


3 Answers

Explicitly, point to your main file (usually index.js). E. g.

import ... from './models'          // ❌
import ... from './models/index.js' // ✅

Alternative way:

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

like image 128
Mir-Ismaili Avatar answered Oct 20 '22 13:10

Mir-Ismaili


In Node.js, import statements are permitted only in ES modules. so, directory imports do not work in Node.js. Read Node.js Documentation.

like image 28
Kelum Sampath Edirisinghe Avatar answered Oct 20 '22 14:10

Kelum Sampath Edirisinghe


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",
    ...
},
like image 4
dan674 Avatar answered Oct 20 '22 14:10

dan674