无法在 Google Cloud Functions 中使用 ES 模块

Enz*_*nzo 5 javascript node.js google-cloud-functions

我正在尝试使用 Node.js 部署一个非常基本的 Google Cloud 无服务器应用程序,但它在 Google Cloud Console 上不断显示以下错误:

\n
Provided module can\'t be loaded.\nIs there a syntax error in your code?\nDetailed stack trace: Error [ERR_REQUIRE_ESM]: Must use import to load ES Module: /workspace/index.js\nrequire() of ES modules is not supported.\nrequire() of /workspace/index.js from /layers/google.nodejs.functions-framework/functions-framework/node_modules/@google-cloud/functions-framework/build/src/loader.js is an ES module file as it is a .js file whose nearest parent package.json contains "type": "module" which defines all .js files in that package scope as ES modules.\nInstead rename index.js to end in .cjs, change the requiring code to use import(), or remove "type": "module" from /workspace/package.json.\n at Object.Module._extensions..js (internal/modules/cjs/loader.js:1080:13)\n at Module.load (internal/modules/cjs/loader.js:928:32)\n at Function.Module._load (internal/modules/cjs/loader.js:769:14)\n at Module.require (internal/modules/cjs/loader.js:952:19)\n at require (internal/modules/cjs/helpers.js:88:18)\n at Object.getUserFunction (/layers/google.nodejs.functions-framework/functions-framework/node_modules/@google-cloud/functions-framework/build/src/loader.js:29:32)\n at Object.<anonymous> (/layers/google.nodejs.functions-framework/functions-framework/node_modules/@google-cloud/functions-framework/build/src/index.js:77:32)\n at Module._compile (internal/modules/cjs/loader.js:1063:30)\n at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)\n at Module.load (internal/modules/cjs/loader.js:928:32)\nCould not load the function, shutting down.\n
Run Code Online (Sandbox Code Playgroud)\n

这是我的index.js文件:

\n
export function foobar(req, res) {\n    res.status(200).send("Hello World!");\n}\n
Run Code Online (Sandbox Code Playgroud)\n

这是我的package.json文件:

\n
{\n  ...\n  "main": "index.js",\n  "type": "module",\n  ...\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我正在使用它运行

\n
gcloud functions deploy foobar --region europe-west1 --runtime nodejs14 --trigger-http --allow-unauthenticated\n
Run Code Online (Sandbox Code Playgroud)\n

我已经尝试过以下操作:

\n
    \n
  1. 将index.js重命名为index.mjs并在package.json"main": "index.js"中更改为(错误仍然存​​在)"main": "index.mjs"

    \n
  2. \n
  3. 解决方案 1 加上"type": "module"package.json中删除(错误仍然存​​在)

    \n
  4. \n
  5. "type": "module"package.json中删除(引发 SyntaxError: Unexpected token \'export\')

    \n
  6. \n
  7. 将index.js重命名为index.cjs并更改"main": "index.js""main": "index.cjs"package.json(引发语法错误:意外的标记\'export\')

    \n
  8. \n
  9. 解决方案 4 加上"type": "module"package.json中删除(引发 SyntaxError: Unexpected token \'export\')

    \n
  10. \n
  11. 添加--experimental-modules标志gcloud functions deploy(显示无法识别的参数:--experimental-modules)

    \n
  12. \n
  13. 解决方案 6 但替换gcloud functions deploygcloud beta functions deploy(显示无法识别的参数:--experimental-modules)

    \n
  14. \n
  15. 完全卸载 Google Cloud SDK 并再次尝试上述所有解决方案

    \n
  16. \n
\n

唯一有效的解决方案是解决方案 3 加上使用

\n
exports.foobar = (req, res) => {\n    res.status(200).send("Hello World!");\n}\n
Run Code Online (Sandbox Code Playgroud)\n

但是,我想将它用于具有 module 的 Telegram 机器人node-telegram-bot-api但因为我"type": "module"package.json中删除,所以当我导入 Telegram API 时,它会引发“SyntaxError:无法在模块外使用 import 语句”。

\n

项目结构是使用创建的npm init,如下所示。

\n
.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 index.js\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 package.json\n
Run Code Online (Sandbox Code Playgroud)\n

有什么想法吗?我的 Node.js 版本是 v14.17.0,我的 Google Cloud SDK 版本是 v342.0.0。

\n

小智 2

Google Cloud Functions(以及 Firebase Functions)尚不支持 ESM 模块:

https://github.com/GoogleCloudPlatform/functions-framework-nodejs/issues/233 https://github.com/firebase/firebase-tools/issues/2994

现在我认为你正在混淆使用和打包 ES 模块。您不必将函数代码打包为 ES 模块即可使用node-telegram-bot-apimodule. 只需使用语法导入即可require,而不是使用import语法。