Tommy Leong
Tommy Leong

Reputation: 3020

Getting empty value from Lambda

New to AWS and working on Lambda with Node.JS

I have the following code works on my local, but once I uploaded to Lambda (via CLI with successful status) .. however I realized it complaint about index.hanlder issue. Hence after Googling, I updated my code to the 2nd version, it runs fine with Status 200 but return me a NULL.

I've tested the local code and it returns my data from DynamoDB. What seems to be the mistake here?

To provide extra information:

Local Code

const express = require('express');
const router = new express.Router();
const awsSDK = require('aws-sdk');
const dynamodb = new awsSDK.DynamoDB({region:'maskedData', apiVersion:'maskedData'});

router.get('/get', (req,res) => {
const params = {
        TableName: "maskedData"
    };
    dynamodb.scan(params, function(err, data){
        if(err){
            console.log(err);
            // callback(err);
            res.send(err);
        } else {
            console.log(data);
            // callback(null, data);
            res.send(data);
        }
    })

})

module.exports = router;

2nd Version

const express = require('express');
const router = new express.Router();
const awsSDK = require('aws-sdk');
const dynamodb = new awsSDK.DynamoDB({region:'maskedData', apiVersion:'maskedData'});

exports.handler = router.get('/get', (req,res) => {
// router.get('/get', (req,res) => {
const params = {
        TableName: "maskedData"
    };
    dynamodb.scan(params, function(err, data){
        if(err){
            console.log(err);
            // callback(err);
            res.send(err);
        } else {
            console.log(data);
            // callback(null, data);
            res.send(data);
        }
    })

})

// module.exports = router
// exports.handler = router;

Upvotes: 0

Views: 511

Answers (1)

Ashish Modi
Ashish Modi

Reputation: 7770

To be used as lambda you need to have handler function which have event, context and callback parameter (optional). Something like this

const express = require("express");
const awsSDK = require("aws-sdk");
const dynamodb = new awsSDK.DynamoDB({"region": "maskedData", "apiVersion": "maskedData"});

exports.handler = async event => {
  const params = {
    "TableName": "maskedData"
  };
  const data = await dynamodb.scan(params).promise();
  return data;
};

aws sdk supports promise version so you can use that instead of callback based.

Upvotes: 1

Related Questions