AWS Lambda 查询二级索引

AWS Lambda querying secondary index

以下是 AWS lambda 中对 dynamoDB JSON 对象的 node.js 查询。 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);
        }
    }
};

lambda测试数据在哪里

{
  "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));
    });
}

当你说调用成功且没有错误时,我假设你的意思是调用 lambda

如果您使用的是节点版本 4.3,那么从 aws lambda 文档的摘录中可以看出,您从函数中 return 的方式已被弃用

The Node.js runtime v4.3 supports the optional callback parameter. You >can use it to explicitly return information back to the caller. The general syntax is:

callback(Error error, Object result);

使用回调参数是可选的。如果您不使用可选的回调参数,则行为与调用不带任何参数的回调() 相同。您可以在您的代码中指定回调以向调用方提供 return 信息。 如果您不在代码中使用回调,AWS Lambda 将隐式调用它并且 return 值为 null。

This is the correct way to return from an aws lambda function if using node version 4.3

首先像这样向处理函数添加第三个参数

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

那么当 return 从函数中调用时遵循这种形式

    function(err,data){
        if(err){
             callback(err);
        } else {
             callback(null,data);
        }
    }
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);
    });
}

重写了,很干净。