无法使用新的nodejs 8.10将数据插入DynamoDB

时间:2018-05-17 12:44:53

标签: node.js aws-lambda

我想使用新的nodejs 8.10来开发我的lambdas。在节点6.10样式中编写时,一段简单的代码可以工作,但是当我使用节点8.10时,相同的(相似的)代码不起作用。

下面是成功将数据插入到dynamodb表中的工作代码(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);
      }
    });
};

以下是不起作用的节点8.10样式(意味着不将数据插入到dynamodb表中)。我一直将 null 作为返回值。

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";
      }
    });
};

我花了2-3个小时搜索..找不到任何文章或任何类似的问题。谁能告诉我我做错了什么?

3 个答案:

答案 0 :(得分:7)

Async / Await是承诺的语法糖,你的documentClient.put应该充满希望。由于documentClient.put基于回调appoach,因此必须使用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
};

注意:建议在单独的文件中使用DB操作,而不是在处理函数本身中使用

答案 1 :(得分:4)

您是否在表中查看是否正在插入数据?我觉得是这样的。

您的异步样式代码的问题在于您没有返回值。从"Hi, insert data completed"回调中返回put不会返回handler的值。

你可以manually create a promise and return that from handler,但我会尝试使用promisify

此代码未经测试但应该关闭:

...
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);
}

以下是关于promisify的更多信息:http://2ality.com/2017/05/util-promisify.html

答案 2 :(得分:2)

在经过谷歌搜索之后,致电std::advance是解决此问题的方法。具体来说,似乎现在支持在aws sdk中调用await dynamo.put(params).promise();