我在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?
答案 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
}
}
但是如果您不需要抓取单个项目并想要在数据库中查询某些变量键,请尝试这样做。
但是我编写的一个非常简单的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读取访问权限(至少)