我正在尝试使用NodeJS乘客在生产服务器上启动我的Phusion。我使用了最后一个ECM语法来导入/导出我的模块。但是,当试图访问我的api时,乘客将返回以下错误消息:
Error [ERR_REQUIRE_ESM]: Must use import to load ES Module: /home/***/api/server.mjs
at Module.load (internal/modules/cjs/loader.js:948:11)
at Function.Module._load (internal/modules/cjs/loader.js:790:14)
at Module.require (internal/modules/cjs/loader.js:974:19)
at Module.require (/opt/passenger/src/helper-scripts/node-loader.js:80:25)
at require (internal/modules/cjs/helpers.js:92:18)
at loadApplication (/opt/passenger/src/helper-scripts/node-loader.js:243:2)
at setupEnvironment (/opt/passenger/src/helper-scripts/node-loader.js:214:2)
at Object.<anonymous> (/opt/passenger/src/helper-scripts/node-loader.js:133:1)
at Module._compile (internal/modules/cjs/loader.js:1085:14)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1114:10) {
code: 'ERR_REQUIRE_ESM'
我的"type": "module"
行在我的package.json中,我试图将扩展从.js更改为.mjs,但没有生效。
我注意到乘客使用带有"require“语法的CJS加载我的server.js,如我们在这里看到的:https://github.com/phusion/passenger/blob/stable-6.0/src/helper-scripts/node-loader.js。
function loadApplication() {
var appRoot = PhusionPassenger.options.app_root || process.cwd();
var startupFile = PhusionPassenger.options.startup_file || (appRoot + '/' + 'app.js');
require(startupFile);
}
因此,我的问题是:有没有办法不将我的所有代码从ECM更改为CJS,以便与乘客匹配?
发布于 2021-12-03 15:02:44
有一种方法:考虑到所有文件都有.mjs
扩展名,您只需要创建一个.js
作为乘客的入口文件,而在这个文件(它是CommonJS格式)中,您可以动态导入ESM。
因此,与其通过乘客运行node server.mjs
,不如创建一个具有以下内容的entry.js
:
import("./server.mjs");
然后通过乘客给node entry.js
打电话。
注意:您可以为entry.js
文件使用任何其他名称。
发布于 2022-04-17 04:19:17
对上述代码的更新--除非异步调用动态导入,否则对我来说是行不通的:
创建一个entry.cjs文件,并使用异步/等待来动态导入您通常在plesk中设置的应用程序入口文件:
// entry.cjs
async function loadApp() {
const { app } = await import("./app.js"); // this is your normal entry file - (index.js, main.js, app.mjs etc.)
}
loadApp()
然后在Plesk中将应用程序输入文件设置为./entry.cjs
发布于 2022-05-14 06:14:16
为了防止您使用类型记录(这就是我的情况),我通过将代码编译到中的commonJs模块(两个简单的步骤),成功地消除了这个错误。
"type": "commonjs"
packeage.json
文件中的"type": "module"
更改为将tsconfig.json
模块更改为)重建,现在它应该工作了:)
https://stackoverflow.com/questions/69297449
复制