0

Trying to build an api out for my AWS lambda and when I try and run serverless-offline so I can test and see if my api is working I get this error: 'TypeError: Cannot read property 'Subscriptions' of null'.

this is my yaml file:

service: mgm-lambda
frameworkVersion: '3'

plugins:
  - serverless-webpack
  # - serverless-webpack-prisma
  - serverless-dotenv-plugin
  - serverless-lift
  - serverless-offline-sns
  - serverless-offline

provider:
  name: aws
  runtime: nodejs14.x
  region: eu-west-2

custom:
  serverless-offline-sns:
    sns-endpoint: sns.eu-west-2.amazonaws.com
    sns-subscribe-endpoint:  http://deeb-137-221-144-34.ngrok.io
    remotePort: 80
    localPort: 4002
    accountId: 837696398555
    subscriptions:
      - topic: "backend-events"

functions:
  producer:
    handler: handler.producer
    events:
      - sns:
          arn: 'arn:aws:sns:eu-west-2:837696398555:backend-events'
  referral: 
    handler: handler.referral
    events:
      - httpApi:
          path: /referral
          method: get

package.json

{
  "name": "mgm-lambda",
  "version": "1.0.0",
  "description": "Thursday Member Get Member",
  "main": "handler.js",
  "scripts": {
    "test": "serverless-bundle test"
  },
  "author": "",
  "license": "MIT",
  "repository": {
    "type": "git",
    "url": "TODO"
  },
  "devDependencies": {
    "@types/aws-lambda": "^8.10.64",
    "@types/jest": "^26.0.14",
    "@types/luxon": "^2.3.2",
    "@types/node": "^18.0.3",
    "prisma": "^4.4.0",
    "serverless": "^3.22.0",
    "serverless-dotenv-plugin": "^3.0.0",
    "serverless-lift": "^1.20.2",
    "serverless-webpack": "^5.7.1",
    "serverless-webpack-prisma": "^1.1.0",
    "ts-jest": "^28.0.5",
    "ts-loader": "^9.3.1",
    "typescript": "^4.7.4",
    "webpack": "^5.73.0",
    "webpack-node-externals": "^3.0.0"
  },
  "dependencies": {
    "@prisma/client": "^4.0.0",
    "aws-sdk": "^2.1225.0",
    "dd-trace": "^2.10.0",
    "ioredis": "^5.1.0",
    "luxon": "^2.4.0",
    "mysql2": "^2.3.3",
    "offline": "0.0.1",
    "sequelize": "^6.21.2",
    "serverless-offline": "^11.0.0",
    "serverless-offline-sns": "^0.76.0",
    "winston": "^3.8.1"
  }
}

handler.ts

import { defaultMaxListeners } from "events";
import { Prisma } from '@prisma/client';

import  getPrismaClient  from "./prisma";
import { userInfo } from "os";
import { Event } from "aws-sdk/clients/s3";

const isLocal = process.env.ENVIRONMENT
  ? process.env.ENVIRONMENT?.includes('local')
  : false;
  let DB_WRITE_HOST: string,
  DB_NAME: string,
  DB_PASSWORD: string,
  DB_USER: string,
  REDIS_CONNECTION_STRING: string;

if (isLocal) {
  DB_WRITE_HOST = process.env.DB_WRITE_HOST || '';
  DB_NAME = process.env.DB_NAME || '';
  DB_PASSWORD = process.env.DB_PASSWORD || '';
  DB_USER = process.env.DB_USER || '';
  REDIS_CONNECTION_STRING = process.env.REDIS_CONNECTION_STRING || '';
}

// const producer = async (event: any) => {
//   let statusCode = 200;
//   let message;

//   const eventsRecord = event.Records[0].Sns.Message.detail;

//   const prisma = await getPrismaClient(
//     DB_USER,
//     DB_PASSWORD,
//     DB_WRITE_HOST,
//     3306,
//     DB_NAME
//   )
  
//   if (eventsRecord.backendEventType === 'user.created' && eventsRecord.body.referredBy ) {
//     // write to table using prisma for EventsLog
//     const eventCreate =  await prisma.eventsLog.create({
//       data: {
//         eventType:      'CREATED',
//         eventJSON:      event.Records[0].Sns,
//         status:         'PROCESSING',
//       }
//     })
//     await prisma.referredUsers.create({
//       data: {
//         id: eventsRecord.body.userId,
//         referredBy: eventsRecord.body.referredBy,
//         status: 'PENDING'
//       }
//     })
//     await prisma.eventsLog.update({
//       where : { id: eventCreate.id },
//       data: {
//         status:         'PROCESSED',
//       }
//     })
    
//   } else if (eventsRecord.backendEventType == 'checkin'){
//     //Add to events log table to declare user verified
//     const userVerified = await prisma.eventsLog.create({
//       data: {
//         eventType:  'CHECKED_IN',
//         eventJSON:  event.Records[0].Sns,
//         status:     'PROCESSING'
//       }
//     })
//     //Check referred user table - if user id exists
//     const findUser = await prisma.referredUsers.findUnique({
//       where: {
//         id: eventsRecord.body.userId
//       }
//     })
//     //If exists - update log to say said user has joined && we update the events log to say item has been processed
//     if (findUser) {
//       await prisma.referredUsers.update({
//         where : { id: eventsRecord.body.userId },
//         data  : {
//           status: 'JOINED'
//         }
//       })
//       const userCreditTotal = await prisma.userCreditTransactions.findFirst({
//         where: { userId : findUser.referredBy},
//         orderBy : {
//           updatedAt : 'desc'
//         }
//       })
//       await prisma.userCreditTransactions.create({
//         data : {
//           userId       : findUser.referredBy,
//           type         : 'REFERRAL',
//           credits      : 1,
//           creditsTotal : userCreditTotal ? userCreditTotal.creditsTotal++ : 1
//         }
//       })
//       await prisma.eventsLog.update({
//         where : { id: userVerified.id},
//         data  : {
//           status: 'PROCESSED'
//         }
//       })
//       //Else - if dont exists: update events log to say status is ignored  
//     } else {
//       await prisma.eventsLog.update({
//         where : { id: userVerified.id },
//         data  : { 
//           status: 'IGNORED'
//         }
//       })
//     }
//   } 


//   return {
//     statusCode,
//     body: JSON.stringify({
//       message
//     })
//   };
// };

const referral = async (event: Event) => {
  let statusCode = 200;


  return {
    statusCode,
    body: JSON.stringify(
      {
        message: 'Referral data',
        input: event,
      },
      null,
      2
    )
  }
}

module.exports = {
  // producer,
  referral
};

Any tips to get round this error? or where the issue lies?

0 Answers0