首页 > 解决方案 > 无法使用新的 nodejs 8.10 将数据插入 DynamoDB

问题描述

我想使用新的 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 个小时搜索.. 找不到任何文章或任何类似的问题。谁能告诉我我做错了什么?

标签: node.jsaws-lambda

解决方案


Async / Await 是 promise 的语法糖,你documentClient.put应该用 promise 包裹起来。由于 documentClient.put 是基于回调方法的,所以你必须用 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 操作,而不是在处理函数本身中使用


推荐阅读