Aws lambda 使用AWS节点JS Lambda读取AWS dynamoDB中的过滤数据

Aws lambda 使用AWS节点JS Lambda读取AWS dynamoDB中的过滤数据,aws-lambda,amazon-dynamodb,Aws Lambda,Amazon Dynamodb,我想从DynamoDB获取元素到我的NodeJS AWS Lambda。我希望由“所有者”列选择,但不起作用。我尝试对“id”列使用相同的语法,结果很好。我是否在dynamoDB中添加索引?在哪里 'use strict'; var AWS = require('aws-sdk'); var documentClient = new AWS.DynamoDB.DocumentClient({'region': 'eu-west-1'}); exports.handler = functio

我想从DynamoDB获取元素到我的NodeJS AWS Lambda。我希望由“所有者”列选择,但不起作用。我尝试对“id”列使用相同的语法,结果很好。我是否在dynamoDB中添加索引?在哪里

'use strict';

var AWS = require('aws-sdk');
var documentClient = new AWS.DynamoDB.DocumentClient({'region': 'eu-west-1'}); 

exports.handler = function(event, context, callback) {
  
  console.log(JSON.stringify(event));

  const claims = event.requestContext.authorizer.claims;
  const username = claims['cognito:username'];
  
  var params = {
    TableName : "tp-exam",
      Key: {
        owner: username 
      }
  };
  
    documentClient.get(params, function(err, data){
      if (err) {
      console.log("Error", err);
      const errResponse = {
        statusCode: 500,
        headers: {
          "Access-Control-Allow-Origin": "*"
        },
        body: JSON.stringify({ Error: 500, device : "DynamoDB"})
      };
      callback(null, errResponse);
    } else {
      console.log("Success", data.Item);
      const response = {
        statusCode: 200,
        headers: {
          "Access-Control-Allow-Origin": "*"
        },
        body: JSON.stringify(data.Item)
      };
        callback(null, response);
    }
        
    });

};
我的错误是:

ValidationException: The provided key element does not match the schema
    at Request.extractError (/var/runtime/node_modules/aws-sdk/lib/protocol/json.js:52:27)
    at Request.callListeners (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:106:20)
    at Request.emit (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:78:10)
    at Request.emit (/var/runtime/node_modules/aws-sdk/lib/request.js:688:14)
    at Request.transition (/var/runtime/node_modules/aws-sdk/lib/request.js:22:10)
    at AcceptorStateMachine.runTo (/var/runtime/node_modules/aws-sdk/lib/state_machine.js:14:12)
    at /var/runtime/node_modules/aws-sdk/lib/state_machine.js:26:10
    at Request.<anonymous> (/var/runtime/node_modules/aws-sdk/lib/request.js:38:9)
    at Request.<anonymous> (/var/runtime/node_modules/aws-sdk/lib/request.js:690:12)
    at Request.callListeners (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:116:18) {
  code: 'ValidationException',
  time: 2021-03-01T21:46:40.263Z,
  requestId: 'C7UHG8354A92SGP2T4FRRFU4GFVV4KQNSO5AEMVJF66Q9ASUAAJG',
  statusCode: 400,
  retryable: false,
  retryDelay: 32.73628085995177
}
ValidationException:提供的键元素与架构不匹配
at Request.extractError(/var/runtime/node_modules/aws sdk/lib/protocol/json.js:52:27)
at Request.callListeners(/var/runtime/node_modules/aws sdk/lib/sequential_executor.js:106:20)
at Request.emit(/var/runtime/node_modules/aws sdk/lib/sequential_executor.js:78:10)
at Request.emit(/var/runtime/node_modules/aws sdk/lib/Request.js:688:14)
at Request.transition(/var/runtime/node_modules/aws sdk/lib/Request.js:22:10)
在AcceptorStateMachine.runTo(/var/runtime/node_modules/aws sdk/lib/state_machine.js:14:12)
at/var/runtime/node_modules/aws sdk/lib/state_machine.js:26:10
应要求。(/var/runtime/node_modules/aws sdk/lib/request.js:38:9)
应要求。(/var/runtime/node_modules/aws sdk/lib/request.js:690:12)
at Request.callListeners(/var/runtime/node_modules/aws sdk/lib/sequential_executor.js:116:18){
代码:“ValidationException”,
时间:2021-03-01T21:46:40.263Z,
requestId:'C7UHG8354A92SGP2T4FRRFU4GFV4KQNSO5AEMVJF66Q9ASUAJG',
状态代码:400,
可检索:错误,
retryDelay:32.73628085995177
}

此错误表示您没有为DynamoDb#get操作提供正确的主键

以下几点提示:

  • 确保提供了正确的分区密钥名称。您确定您的分区键属性名为
    owner
  • 确保提供了整个主键。DynamoDB中的主键有两种形式:简单键和复合键。简单的主键仅由分区键组成。复合主键由分区键和排序键组成。您的错误表明您可能有一个复合主键,但没有指定主键的排序键部分
如果这两个问题都不能解决您的问题,请发布DynamoDB表的详细信息,这样我们就可以看到您的键是如何定义的

或者,如果
owner
属性不是主键的一部分,并且您希望按该字段进行搜索,则有几个选项

  • 使用
    owner
    作为主键或
  • 您可以使用
    scan
    操作按非键属性进行搜索
  • 请注意,第一个选项(创建GSI)是首选方法。

    我们需要一个用于获取或查询备用密钥的方法

    要使用GSI进行查询,我们需要使用查询api

    let docClient = new AWS.DynamoDB.DocumentClient();
    
    documentClient.query(
      {
        TableName: "tp-exam",
        IndexName: "owner-index",
        KeyConditionExpression: "#owner_attr = :ownerVal",
        ExpressionAttributeValues: {
          ":ownerVal": "John",
        },
        ExpressionAttributeNames: {
          "#owner_attr": "owner",
        },
      },
      function (err, data) {
        console.log("err", err, "data", data);
      }
    );
    
    owner
    是一个保留关键字,因此,我们需要使用expressAttributeName替换为实际属性