'Serverless Framework with AWS Lambda error "Cannot find module"

I'm trying to use the Serverless Framework to create a Lambda function that uses open weather NPM module. However, I'm getting the following exception, but my node_modules contain the specific library.

I have managed to run the sample, (https://github.com/serverless/examples/tree/master/aws-node-rest-api-with-dynamodb) successfully, now hacking to add node module to integrate open weather API.

Endpoint response body before transformations: {"errorMessage":"Cannot find module 'Openweather-Node'","errorType":"Error","stackTrace":["Module.require (module.js:353:17)","require (internal/module.js:12:17)","Object.<anonymous> (/var/task/todos/weather.js:4:17)","Module._compile (module.js:409:26)","Object.Module._extensions..js

My code

'use strict';

  const AWS = require('aws-sdk'); // eslint-disable-line import/no-extraneous-dependencies
  var weather = require('Openweather-Node');

  const dynamoDb = new AWS.DynamoDB.DocumentClient();

  module.exports.weather = (event, context, callback) => {
    const params = {
      TableName: process.env.DYNAMODB_TABLE,
      Key: {
        id: event.pathParameters.id,
      },
    };

    weather.setAPPID("mykey");
    //set the culture
    weather.setCulture("fr");
    //set the forecast type
    weather.setForecastType("daily");

    const response = {
      statusCode: 200,
      body: "{test response}",
    };
    callback(null, response);          
  };


Solution 1:[1]

I fixed this error when in package.json I moved everything from devDependencies to dependencies.

Cheers

Solution 2:[2]

I don't if it applies to this answer but in case someone just needs a brain refresh I forgot to export my handler and was exporting the file with was looking for a default export that didn't exist...

changed from this... handler: foldername/exports

to this... handler: foldername/exports.handler

Solution 3:[3]

I have the same problem with serverless framework to deploy multiple lambda functions. I fixed by the following steps

  1. Whatever you keep the path at the handler like handler: foldername/exports.handler
  2. Name the file inside the folder as exports.js(whatever you name the handler)
  3. run serverless deploy

This should solve your problem

Solution 4:[4]

You need to do the package deployment in case you have external dependencies. Please see this answer

AWS Node JS with Request

Reference

http://docs.aws.amazon.com/lambda/latest/dg/nodejs-create-deployment-pkg.html

Solution 5:[5]

In several cases, don't forget to check global serverless installation. mine solved by reinstalling:

npm install -g serverless

Solution 6:[6]

In my case, what worked was switching to node 10 (via nvm). I was using a newer version of node (v15.14.0) than was probably supported by the packages.

Solution 7:[7]

My case was configuring params for creating an AWS lambda function. The right string for a handler was (last row):

Resources:
  StringResourceName:
    Type: 'AWS::Serverless::Function'
    Properties:
      Handler: myFileName.handler

Where myFileName is the name of a file that I use as the zip file.

Solution 8:[8]

For me, the issue was that the handler file name contained a dot.

main-handler.graphql.js caused serverless "Error: Cannot find module 'main'.

when I changed the file to main-handler-graphql.js everything worked.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 user1398619
Solution 2 Phil Andrews
Solution 3 Ravikiran Reddy Kotapati
Solution 4 Community
Solution 5 Jastria Rahmat
Solution 6 AndyFaizan
Solution 7 Roman
Solution 8 Eitan Frailich