AWS Lambda запрашивает вторичный индекс

Ниже приведен запрос node.js в лямбда-выражении AWS для объекта JSON DynamoDB. UserID - это первичный ключ без ключа сортировки. GeoHash - это вторичный ключ с индексным именем "GeoHash-index". Вызов завершается без ошибок, но ничего не возвращается. Вполне возможно, что приведенные ниже тестовые данные неверны, так как они не предлагают никакой связи с именем индекса, но я новичок в AWS/noSQL и немного потерян.

var AWS = require('aws-sdk');
var docClient = new AWS.DynamoDB({apiVersion: '2012-08-10'});

exports.handler = function(event,context,callback) {

    console.log(JSON.stringify(event, null, '  '));

    var tableName = "table1";

    // getItem
    docClient.getItem({
        TableName: tableName,
        IndexName: "GeoHash-index",
        KeyConditionExpression: "GeoHash = :geohash",
        ExpressionAttributeValues: {":geohash": "dpz886gb0tb0"}
    }), 

    function(err,data){
        if(err){
             callback(err);
        } else {
             callback(null,data);
        }
    }
};

Где данные лямбда-теста

{
  "GeoHash": "dpz886gb0tb0",
  "Radius": 2,
  "Timestamp": 1472601493180,
  "UserID": "User1"
}

Строка GeoHash должна соответствовать друг другу. Мысли?

РЕДАКТИРОВАТЬ Нет успеха с этим методом либо

var AWS = require('aws-sdk');
var docClient = new AWS.DynamoDB({apiVersion: '2012-08-10'});

exports.handler = function index(event, context, callback) {
    var params = {
        TableName: "LocationAware1",
        IndexName: "GeoHash-index",
        KeyConditionExpression: "GeoHash = :geohash",
        ExpressionAttributeValues: {
            ":geohash": {'S': 'dpz886gb0tb0'}
        },
    };

    docClient.query(params, function(err, data) {
        if (err)
            console.log(JSON.stringify(err));
        else
            console.log(JSON.stringify(data));
    });
}

2 ответа

Решение
var AWS = require('aws-sdk');

exports.handler = function(event,context,callback) {

    var params = {
      TableName: 'Table1',
      IndexName: 'GeoHash-index',
      KeyConditionExpression: 'GeoHash = :geohash',
      ExpressionAttributeValues: {
        ':geohash': 'dpz886g8p9e2',
      }
    };

    var docClient = new AWS.DynamoDB.DocumentClient();

    docClient.query(params, function(err, data) {
       if (err) callback(err);
       else callback(null, data);
    });
}

Переписал и все чисто.

Когда вы говорите, что вызов завершается без ошибок, я предполагаю, что вы имеете в виду вызов к лямбде

Если вы используете версию 4.3 узла, то способ возврата из функции считается устаревшим, как видно из этого фрагмента из документации по лямбда aws.

Среда выполнения Node.js v4.3 поддерживает необязательный параметр обратного вызова. Вы можете использовать его для явного возврата информации обратно вызывающей стороне. Общий синтаксис:

обратный вызов (ошибка, объектный результат);

Использование параметра обратного вызова необязательно. Если вы не используете необязательный параметр обратного вызова, поведение будет таким же, как если бы вы вызвали обратный вызов () без каких-либо параметров. Вы можете указать обратный вызов в своем коде, чтобы вернуть информацию вызывающей стороне. Если вы не используете обратный вызов в своем коде, AWS Lambda будет вызывать его неявно, а возвращаемое значение будет нулевым.

Это правильный способ возврата из лямбда-функции aws, если используется версия узла 4.3

сначала добавьте третий параметр в функцию-обработчик, как

    exports.handler = function(event,context,callback)

затем при возвращении из функции следуйте этой форме

    function(err,data){
        if(err){
             callback(err);
        } else {
             callback(null,data);
        }
    }
Другие вопросы по тегам