我想将元素从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
}
我们需要一个全局二级索引来获取或查询备用键。
并使用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
是保留关键字,因此,我们需要使用ExpressAttributeNames替换为实际属性。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句