如果我导入没有 `js` 扩展名的文件,ExpressJs 会返回错误 `ERR_MODULE_NOT_FOUND`

Muk*_*kur 15 node.js express ecmascript-6 es6-modules

我通过 ES6 构建了一个 expressJs 应用程序,但出现以下错误:

(node:4132) ExperimentalWarning: The ESM module loader is experimental.
internal/modules/run_main.js:54
    internalBinding('errors').triggerUncaughtException(
                              ^

Error [ERR_MODULE_NOT_FOUND]: Cannot find module 'E:\wamp64\www\myDemos\nodeJs\expressJsExample\config\app' imported from E:\wamp64\www\myDemos\nodeJs\expressJsExample\server.mjs
?[90m    at finalizeResolution (internal/modules/esm/resolve.js:255:11)?[39m
?[90m    at moduleResolve (internal/modules/esm/resolve.js:603:10)?[39m
?[90m    at Loader.defaultResolve [as _resolve] (internal/modules/esm/resolve.js:644:13)?[39m
?[90m    at Loader.resolve (internal/modules/esm/loader.js:94:40)?[39m
?[90m    at Loader.getModuleJob (internal/modules/esm/loader.js:240:28)?[39m
?[90m    at ModuleWrap.<anonymous> (internal/modules/esm/module_job.js:42:40)?[39m
?[90m    at link (internal/modules/esm/module_job.js:41:36)?[39m {
  code: ?[32m'ERR_MODULE_NOT_FOUND'?[39m
}
[nodemon] app crashed - waiting for file changes before starting...
Run Code Online (Sandbox Code Playgroud)

如果我使用import app from './config/app.js';然后工作但如果我使用import app from './config/app';然后返回上述错误。

下面是我的代码:

包.json

{
  "name": "ExpressJsExample",
  "version": "1.0.0",
  "description": "Express Js Example",
  "main": "server.js",
  "type": "module",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "nodemon server.js"
  },
  "author": "Mukesh Singh Thakur",
  "license": "ISC",
  "dependencies": {
    "body-parser": "^1.19.0",
    "chalk": "^4.0.0",
    "dotenv": "^8.2.0",
    "express": "^4.17.1",
    "http": "0.0.1-security",
    "http-errors": "^1.7.3",
    "jsonwebtoken": "^8.5.1",
    "nodemon": "^2.0.2",
    "pg": "^8.0.0",
    "request": "^2.88.2",
    "sequelize": "^5.21.6"
  },
  "devDependencies": {
    "sequelize-cli": "^5.5.1"
  }
}
Run Code Online (Sandbox Code Playgroud)

服务器.js

import http from 'http';
import app from './config/app';

const server = http.Server(app);
server.listen(3000, () => {
       return true;
});
Run Code Online (Sandbox Code Playgroud)

应用程序.js

import express from 'express';
const app = express();

export default app;
Run Code Online (Sandbox Code Playgroud)

示例应用程序在https://github.com/msthakur08/express-js-exampleURL 中可用。示例文件导入时存在“.js”,但我想导入不存在“.js”的文件。

sha*_*ngi 52

如果有人仍在搜索,我使用节点版本 15 遇到此错误,我导入的文件没有.js文件扩展名,添加这解决了我的问题。

  • 编辑器/IDE 的自动导入没有 .js 扩展名,这有点蹩脚。不过很高兴知道。我一直认为这没有什么区别。 (10认同)

小智 20

您可以将其添加到您的包 json 中

"scripts": {
    "start": "nodemon --experimental-modules --es-module-specifier-resolution=node index.js"
},
Run Code Online (Sandbox Code Playgroud)

  • 嘿,我添加了这个,但没有任何帮助 (3认同)

Abd*_*afi 14

您可以通过以下方式解决此问题:

将节点添加--es-module-specifier-resolution=node到您的节点命令中。

完整命令: node --experimental-modules --es-module-specifier-resolution=node app.js

  • 参数的顺序实际上很重要!!!! (2认同)
  • 解决了。这是什么意思? (2认同)

Jat*_*tra 9

我用这种方法解决了这个问题:-

当您在 Node 中使用 Es6 导入/导出功能时,您需要在".mjs" extension导入重命名模块之前 导入模块./path-to/app.js to ./path-to/app.mjs

并将您的代码更改为此

import http from 'http';
import app from './config/app.mjs'; //.mjs extension is necessary

const server = http.Server(app);
server.listen(3000, () => {
       return true;
});
Run Code Online (Sandbox Code Playgroud)

并运行你的 app.jsnode --experimental-modules app.js

有关此的更多信息https://nodejs.org/api/esm.html


JRi*_*dsz 3

示例import 'express'解析为./node_modules/express/index.js.

在您的情况下,创建一个名为app的文件夹,其中包含一个 index.js 。之后,您可以使用此行导入或要求它:

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