基本上,我在Lambda函数中有一个DynamoDB连接。将在下面发布代码。此DynamoDB连接似乎表现正常 - 它能够成功调用listTable和describeTable函数,这意味着它具有正确的配置 - 但查询它不返回任何内容,甚至我知道的查询是正确的,并在Dynamo控制台上进行了测试。
更新:能够在单独的索引上使用字符串成功查询,但仍然无法基于二进制查询...
这是Lambda函数的一部分:
const AWS = require('aws-sdk');
const SNS = new AWS.SNS({ apiVersion: '2010-03-31', region: 'sa-east-1' });
const DDB = new AWS.DynamoDB({ apiVersion: '2012-08-10', region: 'sa-east-1' })
const Lambda = new AWS.Lambda({ apiVersion: '2015-03-31' });
const async = require('async');
const CREATE_NOTIFICATIONS = 'create-notifications'
const QUERY_TOKENS = 'query-tokens'
function getUsers(functionName, message, callback) {
var msg = JSON.parse(message);
var users = [];
console.log(DDB);
async.forEachOf(msg.targetsb64, function(value, index, cb) {
console.log("getUsers b64: ", value)
console.log(typeof(value))
DDB.describeTable({
TableName: 'tsGroups'
}, function(err, data) {
console.log(err)
console.log(data.Table.KeySchema)
})
DDB.query({
TableName: 'tsGroups',
KeyConditionExpression: "identifier = :v_user",
ExpressionAttributeValues: {
":v_user": {"B": value}
}
}, function(err, data) {
if (err) {
cb(err)
} else {
console.log("data: ", data)
console.log("items: ", data.Items)
data.Items.forEach(function(item) {
users.push.apply(users, item.users.BS)
})
cb()
}
})
}, function(err) {
if (err) {
callback(err)
} else {
console.log("getUsers users: ", users);
const promises = users.map((user) => invokeQueryTokens(functionName, msg, user));
Promise.all(promises).then(() => {
const result = `Users messaged: ${users.length}`;
console.log(result);
callback(null, result);
});
}
})
}
我尝试过使用KeyConditions代替KeyConditionExpression,但无济于事。值是指从早期的Lambda函数传递的base64标识符字符串 - 我试过硬编码正确的值,没有帮助。 describeTable函数仅用于详细说明DynamoDB正确连接并且位于正确的区域。
TL; DR:上面代码片段中的data.Items值总是一个空数组,即使在我知道应该返回一些查询时也是如此。我的错误是什么?
谢谢,欢呼!