如何让解析服务器检测到我现在正在使用ESM?

问题描述 投票:0回答:1

我想在我的 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
命令并强制执行时,它才有效。

javascript node.js parse-server
1个回答
0
投票

我最终使用@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,
...
});

我不会测试我的课程是否有问题,如果是这样,我会让您知道,但我的云功能可以工作。

© www.soinside.com 2019 - 2024. All rights reserved.