使用Lambda查询DynamoDB中的单个项目

时间:2017-10-23 16:26:53

标签: node.js amazon-dynamodb aws-lambda serverless

我在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?

1 个答案:

答案 0 :(得分:0)

有一件事,我没有看到如何在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 Application,如下所示:

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读取访问权限(至少)