【问题标题】:Node JS (cpanel) Error: I'm getting an error [ERR_REQUIRE_ESM]: Must use import to load ES Module节点 JS (cpanel) 错误:我收到错误 [ERR_REQUIRE_ESM]:必须使用导入来加载 ES 模块
【发布时间】:2022-12-17 03:04:34
【问题描述】:

因此,我今天花了好几个小时尝试放置完全使用 ESM(模块)的 nodeJS 应用程序,并且我已经通过 cPanel 将其部署在使用 Node v. 14.20.1 的服务器上。我不断收到错误消息:

 App 1153856 output: internal/modules/cjs/loader.js:948
App 1153856 output:     throw new ERR_REQUIRE_ESM(filename);
App 1153856 output:     ^

Error [ERR_REQUIRE_ESM]: Must use import to load ES Module: /<serverlocation>/app.js
    App 1153856 output:     at new NodeError (internal/errors.js:322:7)
    App 1153856 output:     at Module.load (internal/modules/cjs/loader.js:948:11)
    App 1153856 output:     at Function.Module._load (internal/modules/cjs/loader.js:790:12)
    App 1153856 output:     at Module.require (internal/modules/cjs/loader.js:974:19)
    App 1153856 output:     at Module.require (/opt/cpanel/ea-ruby27/root/usr/share/passenger/helper-scripts/node-loader.js:80:25)

所有文件都写成模块,我在任何地方都没有“require()”。

由于 Node 从 v14 开始完全支持 JS 模块,我大胆猜测我正在使用的托管服务器(以及他们的 NodeJS Passenger)正在使用一个在调用我的应用程序时使用“require()”的加载器。 .js 文件。 我尝试了多种解决方案,我什至将我的 app.js 文件切换为 CommonJS 类型,但随后它要求我将所有其他文件也切换为 CJS,这太麻烦了。

有没有人设法找到解决这个问题的合适方法?

【问题讨论】:

  • 你确定package.json中有"type": "module"吗?
  • @KonradLinkowski 是的,从一开始。还尝试将其删除并将文件重命名为 .mjs,但这也无济于事。

标签: node.js passenger es6-modules


【解决方案1】:

对于任何试图解决这个问题的人,这就是我解决它的方法:

1- 创建加载程序脚本:不一定与应用程序的主 app.js 文件位于同一文件夹中,但这是我创建它的地方。将其命名为类似 loader.cjs 的名称。如果您的 package.json 中有 "type": "module",则扩展名为 .cjs 很重要。 您可能已经猜到了,这将是您应用程序的新主程序。由于 passenger 的加载器有 ES 模块的问题,所以让它加载一个 commonjs 文件。

2- app.js 的动态导入:你知道你仍然可以在 commonjs 文件中加载 ES 模块吗?你只需要一点点额外的东西就可以做到这一点。 显然,ES 模块是异步加载的,这不适用于同步的 commonjs 文件。这就是为什么你首先遇到这个问题,对吧? 因此,解决方案是:动态导入。就像异步函数一样,将 ES 模块的导入视为承诺。我不太喜欢使用 .then(),所以我选择了等待:

async function loadApp() {
    await import("/path/to/app.js");
}

loadApp();

3- 重命名您的 app.js 扩展名:我不完全知道为什么这是必要的,但我得到了“找不到/path/to/app.mjs”的错误,所以我把它改成了这样。然后它起作用了。您可以在上一点的路径中将文件名保留为“app.js”,导入仍然会正确查找“app.mjs”;

可能有更有效的方法来做到这一点,但这是我的 2 个大脑可以想出的。希望它也能帮助其他人。

【讨论】:

    猜你喜欢
    • 2021-06-18
    • 1970-01-01
    • 2020-09-06
    • 2021-12-01
    • 1970-01-01
    • 2021-09-26
    • 2020-10-13
    • 2022-07-13
    • 2021-09-06
    相关资源
    最近更新 更多