AWS Lambda查询二级索引

时间:2016-08-31 00:34:57

标签: node.js amazon-web-services amazon-dynamodb aws-lambda secondary-indexes

以下是在一个dynamoDB JSON对象上的AWS lambda中的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));
    });
}

2 个答案:

答案 0 :(得分:1)

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

如果您使用的是节点版本4.3,则从该函数返回的方式已弃用,如aws lambda文档中的摘录所示

  

Node.js运行时v4.3支持可选的回调参数。您可以使用它来显式地将信息返回给调用者。一般语法是:

     
    

回调(错误错误,对象结果);

  
     

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

     
    

如果使用节点版本4.3

,这是从aws lambda函数返回的正确方法   

首先将第三个参数添加到处理函数中,如此

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

然后从函数返回时请遵循此表单

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

答案 1 :(得分:1)

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

重写并且它很干净。