Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cant insert data into DynamoDB using new nodejs 8.10

I want to use new nodejs 8.10 for developing my lambdas. A simple piece of code when written in node 6.10 style works but the same(similar) code doesn't work when I use node 8.10.

Below is working code which successfully inserts data into dynamodb table(nodejs 6.10)

var AWS = require('aws-sdk');
// Set the region 
AWS.config.update({region: 'us-east-1'});
var documentClient = new AWS.DynamoDB.DocumentClient({apiVersion: '2012-08-10'});


exports.handler = (event, context, callback) => {
    // TODO implement

    var params = {
      Item: {
        client: 'client_'+Math.random(),
        Type: 1,
        Status: true,
        json: { foo: 'bar', address:{ city:'Pune', street: 'ABC Nagar', pin:'411099'} }
      },
      TableName: 'clients'
    };

    documentClient.put(params, function(err, data) {
      if (err) {
        console.log("Error", err);
        callback(err, null);
      } else {
        console.log("Success", data);
        // return "Hi, insert data completed";
        callback(null, data);
      }
    });
};

And below one which is node 8.10 style which doesn't work(means doesn't insert data into dynamodb table). I keep getting null as return value.

var AWS = require('aws-sdk');
// Set the region 
AWS.config.update({region: 'us-east-1'});
var documentClient = new AWS.DynamoDB.DocumentClient({apiVersion: '2012-08-10'});


exports.handler = async (event) => {
    // TODO implement

    var params = {
      Item: {
        client: 'client_'+Math.random(),
        Type: 1,
        Status: true,
        json: { foo: 'bar', address:{ city:'Pune', street: 'ABC Nagar', pin:'411099'} }
      },
      TableName: 'clients'
    };

    documentClient.put(params, function(err, data) {
      if (err) {
        console.log("Error", err);
      } else {
        console.log("Success", data);
        return "Hi, insert data completed";
      }
    });
};

I spent searching 2-3 hours searching.. couldn't find any article or any question similar. Can anyone tell me what am I doing wrong?

like image 250
Mahammad Jilan Basha Avatar asked Dec 01 '22 14:12

Mahammad Jilan Basha


2 Answers

Async / Await is a syntactical sugar for promise, Your documentClient.put should be wraped with promise. Since documentClient.put is based on callback appoach, you have to wrap it with promise

var AWS = require('aws-sdk');
// Set the region 
AWS.config.update({region: 'us-east-1'});
var documentClient = new AWS.DynamoDB.DocumentClient({apiVersion: '2012-08-10'});

exports.handler = async (event) => {
    // TODO implement

    var params = {
      Item: {
        client: 'client_'+Math.random(),
        Type: 1,
        Status: true,
        json: { foo: 'bar', address:{ city:'Pune', street: 'ABC Nagar', pin:'411099'} }
      },
      TableName: 'clients'
    };

    let putItem = new Promise((res, rej) => {
        documentClient.put(params, function(err, data) {
          if (err) {
            console.log("Error", err);
            rej(err);
          } else {
            console.log("Success", data);
            res("Hi, insert data completed");
          }
        }); 
    });

    const result = await putItem;
    console.log(result);    
    return result
};

Note: Its advisable to use DB operations in separate file,rather than using in handler function itself

like image 109
Ashok JayaPrakash Avatar answered Dec 03 '22 04:12

Ashok JayaPrakash


Did you look in your table to see if it's inserting data? I think it is.

The problem with your async-style code is that you aren't returning a value. Returning "Hi, insert data completed" from the put callback doesn't return a value from handler.

You could manually create a promise and return that from handler, but I'd try using promisify.

This code is untested but should be close:

...
const util = require('util');
...
documentClient.putPromise = util.promisify(documentClient.put);
...
try {
    const data = await documentClient.putPromise(params);
    console.log("Success", data);
    return "Hi, insert data completed";
}
catch (err) {
    console.log("Error", err);
}

Here's more on promisify: http://2ality.com/2017/05/util-promisify.html

like image 44
Andy Gaskell Avatar answered Dec 03 '22 04:12

Andy Gaskell