gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 04:48:57 24 4
gpt4 key购买 nike

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

Provided module can't be loaded.
Is there a syntax error in your code?
Detailed stack trace: Error [ERR_REQUIRE_ESM]: Must use import to load ES Module: /workspace/index.js
require() of ES modules is not supported.
require() 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.
Instead rename index.js to end in .cjs, change the requiring code to use import(), or remove "type": "module" from /workspace/package.json.
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1080:13)
at Module.load (internal/modules/cjs/loader.js:928:32)
at Function.Module._load (internal/modules/cjs/loader.js:769:14)
at Module.require (internal/modules/cjs/loader.js:952:19)
at require (internal/modules/cjs/helpers.js:88:18)
at Object.getUserFunction (/layers/google.nodejs.functions-framework/functions-framework/node_modules/@google-cloud/functions-framework/build/src/loader.js:29:32)
at Object.<anonymous> (/layers/google.nodejs.functions-framework/functions-framework/node_modules/@google-cloud/functions-framework/build/src/index.js:77:32)
at Module._compile (internal/modules/cjs/loader.js:1063:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
at Module.load (internal/modules/cjs/loader.js:928:32)
Could not load the function, shutting down.

这是我的 index.js 文件:

export function foobar(req, res) {
res.status(200).send("Hello World!");
}

这是我的package.json 文件:

{
...
"main": "index.js",
"type": "module",
...
}

我正在运行它

gcloud functions deploy foobar --region europe-west1 --runtime nodejs14 --trigger-http --allow-unauthenticated

我已经尝试过以下方法:

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

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

  3. package.json 中删除 "type": "module"(引发 SyntaxError: Unexpected token 'export')

  4. index.js 重命名为 index.cjs 并将 "main": "index.js" 更改为 package.json 中的“main”:“index.cjs”(引发语法错误:意外的 token “导出”)

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

  6. gcloud functions deploy 中添加 --experimental-modules 标志(显示无法识别的参数:--experimental-modules)

  7. 解决方案 6,但将 gcloud functions deploy 替换为 gcloud beta functions deploy(显示无法识别的参数:--experimental-modules)

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

唯一可行的解​​决方案是解决方案 3 加上使用

exports.foobar = (req, res) => {
res.status(200).send("Hello World!");
}

但是,我想将它用于带有 node-telegram-bot-api module 的 Telegram 机器人,但是因为我从 package.json 中删除了 "type": "module",所以当我导入 Telegram API 时它会引发“SyntaxError: Cannot use import statement outside a module” .

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

.
├── index.js
└── package.json

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

最佳答案

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-api 模块。只需使用 require 语法导入它,而不是使用 import 语法。

关于javascript - 无法在 Google Cloud Functions 中使用 ES 模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67764536/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com