【问题标题】:AWS Lambda function error: Cannot find module 'lambda'AWS Lambda 函数错误:找不到模块“lambda”
【发布时间】:2021-11-20 22:37:38
【问题描述】:

我正在尝试使用无服务器在 AWS 中部署 REST API。节点版本 14.17.5。

我的目录结构:

当我成功部署上述内容时,尝试访问 api 时出现以下错误。

2021-09-28T18:32:27.576Z    undefined   ERROR   Uncaught Exception  {
    "errorType": "Error",
    "errorMessage": "Must use import to load ES Module: /var/task/lambda.js\nrequire() of ES modules is not supported.\nrequire() of /var/task/lambda.js from /var/runtime/UserFunction.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 lambda.js to end in .cjs, change the requiring code to use import(), or remove \"type\": \"module\" from /var/task/package.json.\n",
    "code": "ERR_REQUIRE_ESM",
    "stack": [
        "Error [ERR_REQUIRE_ESM]: Must use import to load ES Module: /var/task/lambda.js",
        "require() of ES modules is not supported.",
        "require() of /var/task/lambda.js from /var/runtime/UserFunction.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 lambda.js to end in .cjs, change the requiring code to use import(), or remove \"type\": \"module\" from /var/task/package.json.",
        "",
        "    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1089:13)",
        "    at Module.load (internal/modules/cjs/loader.js:937:32)",
        "    at Function.Module._load (internal/modules/cjs/loader.js:778:12)",
        "    at Module.require (internal/modules/cjs/loader.js:961:19)",
        "    at require (internal/modules/cjs/helpers.js:92:18)",
        "    at _tryRequire (/var/runtime/UserFunction.js:75:12)",
        "    at _loadUserApp (/var/runtime/UserFunction.js:95:12)",
        "    at Object.module.exports.load (/var/runtime/UserFunction.js:140:17)",
        "    at Object.<anonymous> (/var/runtime/index.js:43:30)",
        "    at Module._compile (internal/modules/cjs/loader.js:1072:14)"
    ]
}

根据错误中的建议,我尝试将 lambda.js 更改为 lambda.cjs。现在我收到以下错误

 2021-09-28T17:32:36.970Z   undefined   ERROR   Uncaught Exception  {
"errorType": "Runtime.ImportModuleError",
"errorMessage": "Error: Cannot find module 'lambda'\nRequire stack:\n- /var/runtime/UserFunction.js\n- /var/runtime/index.js",
"stack": [
    "Runtime.ImportModuleError: Error: Cannot find module 'lambda'",
    "Require stack:",
    "- /var/runtime/UserFunction.js",
    "- /var/runtime/index.js",
    "    at _loadUserApp (/var/runtime/UserFunction.js:100:13)",
    "    at Object.module.exports.load (/var/runtime/UserFunction.js:140:17)",
    "    at Object.<anonymous> (/var/runtime/index.js:43:30)",
    "    at Module._compile (internal/modules/cjs/loader.js:1072:14)",
    "    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1101:10)",
    "    at Module.load (internal/modules/cjs/loader.js:937:32)",
    "    at Function.Module._load (internal/modules/cjs/loader.js:778:12)",
    "    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:76:12)",
    "    at internal/main/run_main_module.js:17:47"
    ]
}

serverless.yml

service: APINAME   #Name of your App
useDotenv: true
configValidationMode: error

provider:
 name: aws
 runtime: nodejs14.x # Node JS version
 memorySize: 512
 timeout: 15
 stage: dev
 region: us-east-1 # AWS region
 lambdaHashingVersion: 20201221

functions:
 api:
   handler: lambda.handler
   events:
     - http: ANY /{proxy+}
     - http: ANY /

lambda.js

import awsServerlessExpress from 'aws-serverless-express'
import app from './index.js'

const server = awsServerlessExpress.createServer(app)
export const handler = (event, context) => {
    awsServerlessExpress.proxy(server, event, context)
}

aws-cli 命令

 docker run --rm -it amazon/aws-cli --version
 docker run --rm -it amazon/aws-cli configure
 docker run --rm -it amazon/aws-cli serverless deploy

无服务器命令:

 docker run --rm -it amazon/aws-cli serverless deploy
 serverless config credentials --provider aws --key <KEY> --secret <SECRET>
 node ./node_modules/serverless/bin/serverless config credentials --provider aws --key <KEY> --secret <SECRET>

在阅读了几个答案后,我尝试了以下方法:

  1. 确保 package.json 包含“type”:“module”
  2. 删除了node_modules和package-lock.json并重新安装了它们(因为node版本在开发过程中更新了)

我做错了什么?

【问题讨论】:

  • 你是如何部署它们的?通过 cdk 或 cli 或 cloudformation 模板?这可能是罪魁祸首 - api 网关没有正确地让 lambda 的 arn 能够连接到它
  • 我正在使用 aws-cli。我大致遵循了这个视频。 youtube.com/watch?v=2_mv0ACpamo&t=1113s。但我在 docker run --rm -it amazon/aws-cli ... 中使用了 docker
  • 你能用你使用的 cli 命令更新你的帖子吗?很确定这就是问题所在 - 无论您告诉 SDK 查找 lambda 文件,它都找不到它。
  • 谢谢。我已经用所有必要的细节更新了这个问题。如果需要更多详细信息,请告诉我。
  • @Saptarshi 您在导入的依赖项之一中有要求吗?因为,就像我说的,在使用type: module 解决方案时,我还没有测试过 require 和 import 之间的互操作性。但是 index.js 文件也需要使用import

标签: node.js aws-lambda serverless


【解决方案1】:

改为将 lambda.js 重命名为以 .cjs 结尾,更改需要使用的代码

import(),

并删除

"type": "module"

来自/var/task/package.json。它在错误中。

【讨论】:

  • 试过但失败了!不过谢谢!
  • 我无法阅读此内容。您是在引用另一个人(因此引用)还是在写答案?
  • @mikemaccana ,我的意思是它在错误中,编辑它以使其清楚
  • @Jandroid 谢谢!这更清楚了,我做了一些进一步的编辑来修复降价。
【解决方案2】:

将所有导入转换为require(),将所有导出转换为module.exports

package.json 中删除了"type": "module"

一切都像一个魅力。这不是问题的解决方案,但让事情发挥作用变得更加重要。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-24
    • 2020-10-14
    • 2019-11-27
    • 2019-05-03
    • 2016-12-21
    • 2015-08-21
    • 2017-06-04
    相关资源
    最近更新 更多