简体   繁体   中英

AWS Lambda function error: Cannot find module 'lambda'

I am trying to deploy a REST API in AWS using serverless. Node version 14.17.5.

My directory structure:

在此处输入图片说明

When I deploy the above successfully I get the following error while trying to access the 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)"
    ]
}

As per the suggestion in the error I tried changing the lambda.js to lambda.cjs. Now I get the following error

 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 commands

 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

serverless commands:

 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>

After reading up a couple of answers I have tried the following:

  1. Made sure package.json includes "type": "module"
  2. Deleted node_modules and package-lock.json and reinstalled all of them (since the version of node was updated during development)

What am I doing wrong?

Converted all imports to require() and all exports to module.exports

Removed "type": "module" from package.json

Everything works like a charm. It is not a solution to the question asked but making things work became more important.

Instead rename lambda.js to end in .cjs, change the requiring code to use

import(),

and

remove \"type\": \"module\" from /var/task/package.json."

It is there in the error.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM