【问题标题】:AWS Lambda querying secondary indexAWS Lambda 查询二级索引
【发布时间】:2017-01-07 10:04:46
【问题描述】:

以下是 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));
    });
}

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    使用回调参数是可选的。如果不使用可选的回调参数,则行为与不带任何参数调用 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);
            }
        }
    

    【讨论】:

    • 仍然有来自 Lambda 的“null”回复... docClient.getItem({ TableName: tableName, Key: { UserID: { S: "User2" }, } },这将返回给我一个然而价值
    【解决方案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);
        });
    }
    

    重写了,很干净。

    【讨论】:

    • 其他人的未来参考:ExpressionAttributeValues: { ':geohash': {S: 'dpz886g8p9e2'}, }您现在需要该类型
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-01
    • 2018-08-02
    • 1970-01-01
    • 2018-11-08
    • 2015-11-09
    • 2018-03-23
    • 1970-01-01
    相关资源
    最近更新 更多