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

Ayo*_*b k 25 node.js es6-modules

我正在使用 Node.js v14.13.0

app.js文件:

import database from './database';

database();
Run Code Online (Sandbox Code Playgroud)

数据库/index.js文件:

import mongoose from 'mongoose';

export default connect = async () => {
    try {
        await mongoose.connect('...', { });
    } catch (error) {}
};
Run Code Online (Sandbox Code Playgroud)

package.json我添加了"type": "module".

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

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

php*_*_qq 16

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

import database from "./database/index.js"
Run Code Online (Sandbox Code Playgroud)

  • 如果通过了 [`--experimental-specifier-resolution=node` 标志](/sf/answers/4591161921/),导入可以保留在 OP 中。 (7认同)
  • 不幸的是不再了。`--experimental-specifier-resolution` 首次在 Node.js v12 中可用,最后在 v18 中可用,从 Node v19 开始它不再存在,您必须使用自定义加载器。 (4认同)
  • 真糟糕,这是他们破坏的众多事情之一。看到 JavaScript 处于巅峰状态真是令人难过,但像这样简单的错误决定确实让它成为了使用的负担。这还需要一段时间,但我看到它即将到来,所有美好的事情都必须结束。 (3认同)

Dan*_*scu 9

这里发生的事情是 Node要求import语句中使用扩展名,并且还声明,

'./startup/index.js'还必须完全指定目录索引(例如)。

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

您可以通过传递--experimental-specifier-resolution=node 标志来更改此节点扩展解析行为。这将起作用,并将保持您的代码不变:

应用程序.js

import database from './database';
database();
Run Code Online (Sandbox Code Playgroud)

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

一位 Node 开发人员承认文档不是那么清楚