简体   繁体   English

错误 [ERR_UNSUPPORTED_DIR_IMPORT]:尝试在本地启动 Nodejs 应用程序时导入目录

[英]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.我在尝试将我的应用程序部署到 Heroku 时陷入了一个循环。 My import statements (eg import cors from 'cors' ) seem to prevent the app from launching in production, due to the "Cannot Load ES6 Modules in Common JS" error.由于“Cannot Load ES6 Modules in Common JS”错误,我的导入语句(例如import cors from 'cors' )似乎阻止了应用程序在生产中启动。 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.但是,当我尝试通过将"type": "module"添加到我的package.json来解决上述错误时,我得到了一组全新的错误,并且该应用程序将不再在本地运行。 I believe this error is due to the way I'm initializing sequelize and associated models but I am unsure.相信这个错误是由于我初始化 sequelize 和相关模型的方式造成的,但我不确定。 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.错误, package.jsonindex.js包括在下面。

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包.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索引.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!谢谢!

Explicitly, point to your main file (usually index.js ).明确地指向您的main文件(通常是index.js )。 Ex:前任:

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

Alternative way:替代方式:

Add --experimental-specifier-resolution=node to node command.--experimental-specifier-resolution=node添加到node命令。 For example:例如:

node --experimental-specifier-resolution=node main.js

See: https://nodejs.org/api/esm.html#esm_customizing_esm_specifier_resolution_algorithm请参阅: https ://nodejs.org/api/esm.html#esm_customizing_esm_specifier_resolution_algorithm

In Node.js, import statements are permitted only in ES modules.在 Node.js 中,仅在 ES 模块中允许导入语句。 so, directory imports do not work in Node.js.因此,目录导入在 Node.js 中不起作用。 Read Node.js Documentation .阅读 Node.js文档

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.尝试将--experimental-specifier-resolution=node标志添加到package.json中的start脚本,特别是如果您在本地运行时使用此标志 - 这是 Heroku 将用于启动服务器的脚本。

scripts": {
    "start": "node --experimental-specifier-resolution=node index",
    ...
},

Try adding this code in package.json尝试在package.json中添加此代码

"scripts": {
  "start": "node --experimental-specifier-resolution=node src/index"
}

Option 1 "type": "module", should come before "main":选项 1“类型”:“模块”,应该在“主”之前:

Option: 2 Update source file to .mjs extension选项:2 将源文件更新为 .mjs 扩展名

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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