Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Handler is undefined or not exported

when trying to run the lambda function I get the error "out/get-user-messages.handler is undefined or not exported". downloading the zip I see the "out" folder in the root and get-user-messages.js inside though. and I am exporting the handler

get-user-messages.ts

import "reflect-metadata";
import { APIGatewayEvent, APIGatewayEventRequestContext, APIGatewayProxyEvent } from "aws-lambda";


export const handler = async (event: APIGatewayProxyEvent, context: APIGatewayEventRequestContext) => { 
/** Code **/
}

tsconfig.json

{
  "compilerOptions": {
    "experimentalDecorators": true,
    "module": "es2015",
    "target": "esnext",
    "noImplicitAny": false,
    "outDir": "./out",
    "strict": false,
    "resolveJsonModule": true,
    "strictNullChecks": false,
    "moduleResolution": "node",
    "emitDecoratorMetadata": true,
    "esModuleInterop": true,    
  },

  "include": ["src/**/*"],
  "exclude": ["node_modules", "**/*.spec.ts", "**/*.test.ts"],
  "paths": {
    "@/*": ["src/*"]
  }
}

webpack.config.js

const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin');
var path = require('path');

/** @type {import('webpack').Configuration} */
module.exports = {
  mode: "production",
  module: {
    mode: "production",
    rules: [
      {
        test: /\.js|.ts|.tsx/,
        exclude: /node_modules/,
        use: 'babel-loader'
        },
    ],
  },
  resolve: {
    extensions: ['*', '.js', '.jsx', '.tsx', '.ts', '.json'],
  },
  module: {
    rules: [
      {
        test: /\.(ts|js)x?$/,
        exclude: /node_modules/,
        use: ["babel-loader"]
      }
    ]
  },
  plugins: [new ForkTsCheckerWebpackPlugin()],
  externals: ['aws-sdk'], //avoid un-needed modules since aws-sdk exists in aws lambdas already
  entry: {
    //list of compiled files
    "get-user-messages": path.join(__dirname, "./src/lambda/get-user-messages.ts"),
    "insert-user-message": path.join(__dirname, "./src/lambda/insert-user-message.ts"),
    "mark-read-user-message": path.join(__dirname, "./src/lambda/mark-read-user-message.ts"),
    "get-application-release-notes": path.join(__dirname, "./src/lambda/get-application-release-notes.ts"),
    "insert-application-release-note": path.join(__dirname, "./src/lambda/insert-application-release-note.ts")
  },
  target: 'node',
  output: {
    path: path.join(__dirname, "./out"),
    filename: "[name].js",
    library: "[name]",
    libraryTarget: 'commonjs'
  }
};

.babelrc

{
    "presets": [
      ["@babel/preset-env",{"targets":{"node":"14"}, "modules":false}],
      "@babel/preset-typescript"
    ],
    "sourceType": "unambiguous",
    "plugins": [
        "babel-plugin-transform-typescript-metadata",
        ["@babel/plugin-proposal-decorators", { "legacy": true }],
        "@babel/plugin-proposal-class-properties",
        "@babel/plugin-transform-runtime"
    ]
  }
like image 246
shoop Avatar asked Oct 21 '25 13:10

shoop


1 Answers

the issue was the "library" option in the output section of webpack.config.js, removing that allowed me to successfully run the lambda function

like image 86
shoop Avatar answered Oct 23 '25 02:10

shoop