-1

我在 DynamoDB 中有一个存储一些数据的表,分区键 - 用户名 - 存储为 CognitoUser 名称以及用户提供的排序键(排序键是“代码”) - 这些构成主键。

我想查询 DynamoDB 中与主键匹配的单个项目。 

这是我的 Lambda 函数;

exports.handler = (event, context, callback) => {
    const type = event.type;
    if (type === 'all'){
        const params = {
            TableName: 'test-record'
        };
        dynamodb.scan(params,function(err,data){
            if(err){
                console.log(err);
                callback(err);
            }else{
                console.log(data);
                const items = data.Items.map(
                    (dataField) =>{
                       return{
                           Date: dataField.Date.S,
                           Code: dataField.Code.S,
                           TelNumber: +dataField.TelNumber.N,
                           NameOfPerson: dataField.NameOfPerson.S,
                           FileNum: dataField.FileNum.S,
                           Purpose: dataField.Purpose.S,
                       };
                    }
                    );
                callback(null,items);
            }
        });
    }else if(type == 'single'){
        const params = {

            Key: {
                "username": {
                    S: dataField.username.S,
                },
                "Code": {
                    S: dataField.Code.S
                }
            },
            TableName: "test-record"  
        };
        dynamodb.getItem(params, function(err,data){
            if(err){
                console.log(err);
                callback(err);
            }else{
                console.log(data);
                callback(null, data);
            }
        });
    }else{
        callback('Something went wrong');
    } };

如果我在这个函数中硬编码“用户名”和“代码”,它会工作并返回正确的数据,但使用上面粘贴的代码会给我一个错误提示;

{ "errorMessage": "RequestId: c410e493-b774-11e7-a528-37d94b51b57b Process exited before completing request" }

任何想法如何从 DynamoDB 获取项目而不必将它们硬放入 Lambda 中?

4

1 回答 1

1

一件事,我看不到数据字段是如何在 map 函数之外的 if(type == 'single') if 语句中初始化的......但除此之外,我认为你应该尝试使用表达式属性名称和值. 我没有用 getItem 测试过,但它适用于查询:

我制作了用于从我的事件主体中查询表的变量,例如:

const queryVariable = eval(JSON.stringify(e.body));

然后我在参数中使用了表达式属性和表达式值来进行查询。

var params = {
  TableName: 'tablename',
  KeyConditionExpression: '#hkn = :v and begins_with(#sk, :skv)',
  ExpressionAttributeNames: {
    "#hkn": "Hash_Key_Name",
    "#sk": "SortKeyName"
  },
  ExpressionAttributeValues: {
    ":qv": queryValue,
    ":skv": sortKeyValue
  }
}

然后你可以调用 docClient.query(params, function(err, data) 等等。也许你可以使用它而不是 getItem。

但是,如果您不需要获取单个项目并且想要查询数据库以获取一些变量键,请尝试此操作。

但是我编写了一个非常简单的 Lambda 函数,用于从 DDB 获取数据到 React Native 应用程序中,如下所示:

const AWS = require('aws-sdk');
const docClient = new AWS.DynamoDB.DocumentClient({region: 'us-west-2'}); 

exports.handle = function(e, ctx, cb) {
  var params = { TableName: 'TableName' }; 
  docClient.scan(params, function(err, data) {
    if(err) { 
      cb(err, null);
    } else { 
      cb(null, data.Items); 
    }
  });
}

确保用于执行 lambda 函数的角色包括 Dynamodb 读取访问权限(至少)

于 2017-10-25T04:30:01.800 回答