我想在我的 Node.js 服务器中使用 ESM 而不是 CommonJS 来运行 ParseServer(版本 6.4.0)。我调整我的代码。但是,Parse-Server 没有检测到我现在正在使用 ECM,并且抛出以下错误:
require() of ES Module ../main.js from ../node_modules/parse-server/lib/ParseServer.js not supported.
Instead change the require of main.js in ../node_modules/parse-server/lib/ParseServer.js to a dynamic import() which is available in all CommonJS modules.
我通过 npm start 命令强制使用 ESM 找到了解决方案:
npm_package_type=module node app.js
但这不是一个可行的解决方案,因为它应该从头开始工作。
要切换到 ESM,我更改了 package.json 中的这些行:
"type": "module",
"engines": {
"node": ">=16"
},
我还在所有文件中使用导入/导出。我还应该做什么才能让解析服务器知道我现在处于 ECM 中?
查看 parseServer 代码,它在这里崩溃了:
if (process.env.npm_package_type === 'module' || ((_json = json) === null || _json === void 0 ? void 0 : _json.type) === 'module') {
await import(path.resolve(process.cwd(), cloud));
} else {
require(path.resolve(process.cwd(), cloud));
}
它崩溃是因为它进入了不允许 ESM 的 require 部分,而不是导入部分。仅当我更改
npm start
命令并强制执行时,它才有效。
我最终使用@SuatKarabacak建议的链接找到了一个解决方案。
为了使其正常工作,我必须在我的
main.js
中创建一个异步函数,然后将其导出为默认函数。看起来像:
const cloud = async function() {
await import("./file.js"); // it contains cloud functions
/**
* parse bindings
* @type {ParseClass}
*/
const ParseClass = (await import("./ParseClass.js"))["default"];
Parse.Object.registerSubclass("ParseClass", ParseClass);
}
export default cloud;
然后在我的
index.js
中,我导入了它:
import cloud from "./cloud/main.js";
我直接在 ParseServer 的配置对象中使用它
new ParseServer({
cloud,
...
});
我不会测试我的课程是否有问题,如果是这样,我会让您知道,但我的云功能可以工作。