【问题标题】:Post JSON in DynamoDB via Lambda通过 Lambda 在 DynamoDB 中发布 JSON
【发布时间】:2018-06-05 16:07:48
【问题描述】:

在我的 Lambda 函数和 AWS 上的 API Gateway 的帮助下,我无法在我的 DynamoDB 表中存储 JSON 文件。我有以下一段代码,一旦我按下我的 HTML 网站上的按钮,就会执行:

  $('#submit').on('click', function(){
    var example = {"number":"121212"};

    $.ajax({
      type: 'POST',
      url: API_URL,
      data: JSON.stringify(example),
      contentType: "application/json",

      success: function(data){
        location.reload();
        }
    });

    return false;
  });

按下时网站会重新加载,因此我认为功能已成功执行。但是我的问题是数据在 lambda 函数中没有以正确的格式到达,因此无法正确执行。签入 CloudWatch 时,它显示为 { number: '121212' } 而不是 {"number":"121212"}。知道如何确保值“到达”在我的 Lambda 函数中具有有效的 JSON 格式吗?

这是我的 Lambda 函数:

exports.handler = function index(e, ctx, callback) {
    var params = {
        Item: { number: e.number },
        TableName: 'collectionOfNumbers'
    };
    docCLient.put(params, function(err, data) {
        if (err) {
            callback(err, null);
        } else {
            callback(null, data);
        }
    });
}

【问题讨论】:

  • { number: '121212' } 表示对我来说似乎是合理的。你是如何在 Lambda 函数中使用这个值的?出了什么问题?
  • 感谢您的回答。这是我链接到我的 API 网关的 post 方法的 Lambda 函数(由于字符限制,我省略了 docClient 和 AWS-sdk)。本质上它不会将值写入数据库。 exports.handler = function index(e, ctx, callback){ var params = { Item: { number: e.number }, TableName: 'collectionOfNumbers' }; docCLient.put(params, function(err, data){ if(err){ callback(err, null); }else{ callback(null, data); } }); }
  • 您是说 put() 调用成功,但您在 DynamoDB 表中没有看到任何证据表明已写入项目?您是否有可能只是覆盖现有项目,因此表中的项目数不会改变?
  • 此外,CORS 已启用,我已授予 IAM 中该功能的大量读/写权限
  • 我认为它甚至没有进入 put() 调用,因为我的 CloudWatch 给了我以下错误(抱歉,我应该在前面提到这一点): SyntaxError: Unexpected token o at Object.在索引处解析(本机)(/var/task/index.js:10:22)

标签: json amazon-web-services aws-lambda amazon-dynamodb aws-api-gateway


【解决方案1】:

如果我没看错,e.number 是您传入的 JSON 参数“number”的值,例如'121212'。我从 docClient 是 putItem 的用法中做出假设。

我认为您的 Item 参数应该如下所示:

Item: {"number": {N: e.number}}

有关 PutItem https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutItem.html 的信息,请参阅 AWS Docs

【讨论】:

  • 感谢您的建议。我试过了,我收到以下错误:“一个或多个参数值无效:预期键号的类型不匹配:S 实际:M”,
  • 这可能意味着 e.number 实际上是一张地图。您可以控制台记录您的事件 (e) 并共享输出吗?
  • 是的,现在我得到:“一个或多个参数值无效:项目中缺少键号”。这有点奇怪,因为我把DynamoDB的key放在名字里了?
  • 查看实际从 API 网关传递到 Lambda 的内容,或者至少查看 e 包含的内容的控制台日志会很有帮助。我怀疑某些东西以一种奇怪的方式被映射了。
猜你喜欢
  • 1970-01-01
  • 2019-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-04
相关资源
最近更新 更多