“使用 Node.js 解析 ES 模块时不支持目录导入”

问题描述 投票:0回答:7

我正在使用 Node.js v14.13.0

app.js 文件:

import database from './database';

database();

数据库/index.js文件:

import mongoose from 'mongoose';

export default connect = async () => {
    try {
        await mongoose.connect('...', { });
    } catch (error) {}
};

package.json 我添加了

"type": "module"

运行应用程序后,我收到以下错误:

错误 [ERR_UNSUPPORTED_DIR_IMPORT]:目录导入 '/Users/xx/Desktop/Projects/node-starter/src/database' 不是 支持解析从以下位置导入的 ES 模块 /Users/xx/Desktop/Projects/node-starter/src/app.js

node.js es6-modules
7个回答
75
投票

使用 ES6 模块,您(还?)无法导入目录。您的导入应该如下所示:

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

45
投票

这里发生的是 Node mandates

import
语句中使用扩展,并且还声明,

还必须完整指定目录索引(例如

'./startup/index.js'
)。

您的

import database from './database';
语句未指定
index.js
。您可以按照另一个答案中的建议添加
index.js
,但是当您最终从 .js 文件导入
.ts
文件时,这种方法在 TypeScript 项目中看起来并不优雅。
您可以通过传递 

--experimental-specifier-resolution=node

flag
来更改此节点扩展解析行为。这将起作用并将保持您的代码不变:

app.js

import database from './database'; database();

运行方式:
node --experimental-specifier-resolution=node app.js

一位 Node 开发人员承认文档

不太清楚


1
投票
但是,您必须安装@babel/core、@babel/node、@babel/preset-env。

并且,您必须像下面那样制作
babel.config.json
{ "presets": ["@babel/preset-env"] }

您应该将 babel.config.json 保留在项目的根文件夹中。
现在,您不必将 "type": "module" 设置为 package.json。




0
投票
文档

,目录导入不起作用


0
投票

在这里你可以看到我做了这个更改,它对我有用,这是我下面的两个文件,我需要编写 require 来导入用户,但在 ES6 中它不支持 require,所以在我的解决方案中我创建了导出默认值users 并且它带有sequelize 和 datatypes 值,所以现在我在index.js 文件中创建了上面的用户导入,这样我就可以在不使用 require 的情况下使用这些值。

您还必须在导入的文件路径中添加(.js)扩展名,就像我在index.js文件第二行中所做的那样。

您的导入应如下所示:

索引.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;

用户.js

const Users = (sequelize, DataTypes) => { sequelize.define( "Users", { name: { type: DataTypes.STRING, }, email: { type: DataTypes.STRING, defaultValue: "[email protected]", }, gender: { type: DataTypes.STRING, }, }, { // timestamps: false, // updatedAt: false, // createdAt: false, // createdAt: created_at, // updatedAt: modified_at, // engine: "Kishan", } `); }; export default Users;



0
投票
可能

必须将依赖项从devDependencies移至

dependencies
。这当然不适合所有用例,但在您的特定上下文中仍然可能有意义。
这解决了我的问题:

// Before "devDependencies": { "third-party-lib": "version" } // After "dependencies": { "third-party-lib": "version" }



-3
投票

"devDependencies": { "babel-cli": "^6.26.0", "babel-plugin-transform-class-properties": "^6.24.1", "babel-preset-env": "^1.6.1" }

虽然可能是旧版本,但你可以使用最新版本。

© www.soinside.com 2019 - 2024. All rights reserved.