Я запрашиваю таблицу DynamodB с ключом партиции и ключом сортировки, используя безсерверную инфраструктуру и nodejs. Я не уверен, что использую правильный синтаксис, потому что, если вы добавляете условие к ключу сортировки, я всегда получаю нулевой результат.
Я пытаюсь это:
//Table definition serverless.yml
resources:
Resources:
ConsentDynamoDBTable:
Type: 'AWS::DynamoDB::Table'
Properties:
AttributeDefinitions:
-
AttributeName: domain
AttributeType: S
-
AttributeName: ts
AttributeType: N
KeySchema:
-
AttributeName: domain
KeyType: HASH
-
AttributeName: ts
KeyType: RANGE
ProvisionedThroughput:
ReadCapacityUnits: 10
WriteCapacityUnits: 10
TableName: ${self:custom.tableName}
//THE QUERY
app.get("/consents/:domain/:startDate/:endDate", function (req, res) {
const params = {
TableName: DEV_TABLE,
KeyConditionExpression: "#dom = :doma AND #tstamp BETWEEN :startDate AND :endDate",
ExpressionAttributeNames: {
"#dom": "domain",
"#tstamp": "ts"
},
ExpressionAttributeValues: {
":doma": req.params.domain,
":startDate": req.params.startDate,
":endDate": req.params.endDate
}
};
console.log("PARAMS: ", params);
dynamoDb.query(params, function(err, data){
if (err) {
res.status(400).json({ error: "Could not get user" });
}
if (data.Items) { // HERE COMES THE ERROR --> TypeError: Cannot read property 'Items' of null
res.json(data.Items);
} else {
res.status(404).json({ error: "User not found" });
}
});
});
Я должен увидеть какой-то вывод или даже [] (есть регистры, соответствующие запросу), но получаю ноль и:
console.log --> PARAMS: { TableName: 'table-dev',
KeyConditionExpression: '#dom = :doma AND #tstamp BETWEEN :startDate AND :endDate',
ExpressionAttributeNames: { '#dom': 'domain', '#tstamp': 'ts' },
ExpressionAttributeValues:
{ ':doma': 'url.com',
':startDate': '1555857529129',
':endDate': '1555857536819' } }
2019-04-21 17:36:21.411 (+02:00) c7f9720f-ea15-4e15-b508-9ffea47935dd TypeError: Cannot read property 'Items' of null
at Response.<anonymous> (/var/task/index.js:95:11)´´´