Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Import in node js file for aws lambda function is not working when I deployed it with serverless #646

Open
BlenDaniel opened this issue Sep 16, 2021 · 1 comment

Comments

@BlenDaniel
Copy link

BlenDaniel commented Sep 16, 2021

Hi,

So I was trying to build a slack app and deploy it to aws. I built the app and it works fine but when I try and create other js files to import them in my main, the aws post url doesn't work.

The structure of my project(app) is:

Slack-app:
-------------- app.js
-------------- app_home.js
-------------- package.json
-------------- package-lock.json
-------------- serverless.yml

..... The others are node_modules, .serverless etc.

So basically, without the import of app_home.js, the code works when deployed to aws lambda. On the slack app, it sends a message back when you type in hello. But when I add an import, the whole thing, doesn't work.

This works:

"use strict";

const { App, AwsLambdaReceiver, WorkflowStep } = require('@slack/bolt');


// Initialize your custom receiver
const awsLambdaReceiver = new AwsLambdaReceiver({
  signingSecret: process.env.SLACK_SIGNING_SECRET,
});

// Initializes your app with your bot token and the AWS Lambda ready receiver
const app = new App({
  token: process.env.SLACK_BOT_TOKEN,
  receiver: awsLambdaReceiver,
  // The `processBeforeResponse` option is required for all FaaS environments.
  // It allows Bolt methods (e.g. `app.message`) to handle a Slack request
  // before the Bolt framework responds to the request (e.g. `ack()`). This is
  // important because FaaS immediately terminate handlers after the response.
  processBeforeResponse: true
});

// Listens to incoming messages that contain "hello"
app.message('hello', async ({ message, say }) => {
  // say() sends a message to the channel where the event was triggered
  await say({
    text: `Hey there <@${message.user}>! \n Have any questions or concerns, Please contact the IT team.`
  });
});

// Handle the Lambda function event
module.exports.handler = async (event, context, callback) => {
  const handler = await awsLambdaReceiver.start();
  return handler(event, context, callback);
}

Where as, this doesn't work at all:


"use strict";

const { App, AwsLambdaReceiver, WorkflowStep } = require('@slack/bolt');

// THIS IS THE LINE THAT I CHANGED FROM THE PREVIOUS CODE
const app_home = require('./app_home')

// Initialize your custom receiver
const awsLambdaReceiver = new AwsLambdaReceiver({
  signingSecret: process.env.SLACK_SIGNING_SECRET,
});

// Initializes your app with your bot token and the AWS Lambda ready receiver
const app = new App({
  token: process.env.SLACK_BOT_TOKEN,
  receiver: awsLambdaReceiver,
  // The `processBeforeResponse` option is required for all FaaS environments.
  // It allows Bolt methods (e.g. `app.message`) to handle a Slack request
  // before the Bolt framework responds to the request (e.g. `ack()`). This is
  // important because FaaS immediately terminate handlers after the response.
  processBeforeResponse: true
});

// Listens to incoming messages that contain "hello"
app.message('hello', async ({ message, say }) => {
  // say() sends a message to the channel where the event was triggered
  await say({
    text: `Hey there <@${message.user}>! \n Have any questions or concerns, Please contact the IT team.`
  });
});

// Handle the Lambda function event
module.exports.handler = async (event, context, callback) => {
  const handler = await awsLambdaReceiver.start();
  return handler(event, context, callback);
}

So, I was just working, if it is a deployment issue?

My code for serverless is:

service: slack-app-bolt-js-forto
frameworkVersion: '2'
provider:
  name: aws
  runtime: nodejs12.x
  lambdaHashingVersion: 20201221
  profile: default
  timeout: 5
  stage: ${opt:stage, 'dev'}
  memorySize: 512
  environment:
    SLACK_SIGNING_SECRET: ${env:SLACK_SIGNING_SECRET}
    SLACK_BOT_TOKEN: ${env:SLACK_BOT_TOKEN}

functions:
  slack:
    handler: app.handler
    memorySize: 1536
    timeout: 30
    events:
      - http:
          path: slack/events
          method: post
          
plugins:
  - serverless-offline

package.json looks like this

{
  "name": "bolt-js-getting-started-app",
  "version": "2.0.0",
  "description": "Getting Started ⚡️ Bolt for JavaScript",
  "main": "app.js",
  "scripts": {
    "ngrok": "ngrok http 3000",
    "start": "node app.js",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "license": "MIT",
  "dependencies": {
    "@slack/bolt": "^3.6.0",
    "axios": "^0.21.4"
  },
  "devDependencies": {
    "serverless": "^2.59.0",
    "serverless-offline": "^8.2.0"
  }
}

@mnapoli
Copy link
Contributor

mnapoli commented Sep 17, 2021

Hi! As far as I understand this is not an issue with the example itself. In that case it would be better to ask for support in GitHub discussions here: https://github.com/serverless/serverless/discussions

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants