shoop
shoop

Reputation: 456

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"
    ]
  }

Upvotes: 4

Views: 3238

Answers (1)

shoop
shoop

Reputation: 456

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

Upvotes: 3

Related Questions