【问题标题】:Getting AWS Dynamodb query result as internel server error code : 502获取 AWS Dynamodb 查询结果作为内部服务器错误代码:502
【发布时间】:2019-02-11 06:02:11
【问题描述】:

这是我的桌子“odo”:

我想检索两个时间戳之间 deviceId == 'A233' 的数据。我在 Lamda Function 中运行查询并使用 API Gateway 进行测试。

这是我为得到结果而运行的查询:

var params = {
    TableName: "odo",
    KeyConditionExpression: "#deviceId = :deviceIdVal AND #timestamp BETWEEN :sdate AND :edate",
    ExpressionAttributeNames: {
        "#deviceId": "deviceId",
        "#timestamp": "timestamp"
    },
    ExpressionAttributeValues: {
        ":deviceIdVal": 'A233',
        ":sdate": 1110601808,
        ":edate": 1522902606
    }
};

但我收到“Internal Server Error”错误和错误代码:502

为什么这个查询不起作用?我错过了什么?

当我使用 id 字段运行另一个查询时,它可以工作。

module.exports.handler = function (event, context, callback) {
    console.log(event);
    let _response = "";
    let invalid_path_err = {
        "Error": "Invalid path request " + event.resource + ', ' +
        event.httpMethod
    };
    if(event.resource === '/odos' && event.httpMethod === "GET"){
        var params = {
            TableName: "odo",
            KeyConditionExpression: "#id = :id",
            ExpressionAttributeNames: {
                "#id": "id"
            },
            ExpressionAttributeValues: {
                ":id": 7
            }
        };



        docClient.query(params, function(err, data) {
            if (err) {
                console.error("Unable to query. Error:", JSON.stringify(err, null, 2));
            } else {
                console.log("Query succeeded.",data);
                _response = buildOutput(200, data);
                return callback(null, _response);
            }
        });

    }
    else {
        _response = buildOutput(500, {"error 500" : "invalid_path_err"});
        return callback(_response, null);
    }
};
/* Utility function to build HTTP response for the microservices output */
function buildOutput(statusCode, data) {
    let _response = {
        statusCode: statusCode,
        headers: {
            "Access-Control-Allow-Origin": "*"
        },
        body: JSON.stringify(data)
    };
    return _response;
};

这是 API Gateway 中测试方法执行成功的结果:

【问题讨论】:

    标签: amazon-web-services aws-lambda amazon-dynamodb


    【解决方案1】:

    问题是您的查询尝试使用deviceid 的表分区键和timestamp 的范围键。实际上,您有一个名为 id 的分区键,但没有范围键。

    您只能在作为键的属性上使用KeyConditionExpression,在您的情况下是属性id

    要进行“查询”,您需要将 KeyConditionExpression 更改为 FilterExpression 并将 query 更改为 scan

    编辑:

    module.exports.handler = function (event, context, callback) {
        console.log(event);
        let _response = "";
        let invalid_path_err = {
            "Error": "Invalid path request " + event.resource + ', ' +
            event.httpMethod
        };
        if(event.resource === '/odos' && event.httpMethod === "GET"){
            var params = {
                TableName: "odo",
                FilterExpression: "#deviceId = :deviceIdVal AND #timestamp BETWEEN :sdate AND :edate",
                ExpressionAttributeNames: {
                    "#deviceId": "deviceId",
                    "#timestamp": "timestamp"
                },
                ExpressionAttributeValues: {
                    ":deviceIdVal": 'A233',
                    ":sdate": 1110601808,
                    ":edate": 1522902606
                }
            };
    
    
    
            docClient.scan(params, function(err, data) {
                if (err) {
                    console.error("Unable to query. Error:", JSON.stringify(err, null, 2));
                } else {
                    console.log("Query succeeded.",data);
                    _response = buildOutput(200, data);
                    return callback(null, _response);
                }
            });
    
        }
        else {
            _response = buildOutput(500, {"error 500" : "invalid_path_err"});
            return callback(_response, null);
        }
    };
    /* Utility function to build HTTP response for the microservices output */
    function buildOutput(statusCode, data) {
        let _response = {
            statusCode: statusCode,
            headers: {
                "Access-Control-Allow-Origin": "*"
            },
            body: JSON.stringify(data)
        };
        return _response;
    };
    

    【讨论】:

    • 您能帮我写一个查询吗?我尝试使用谷歌搜索使用过滤器表达式的方式。但我不明白如何为我的问题编写查询。
    • 请将您的查询发布为代码(不是图像),我会更新它。
    • 试一试
    猜你喜欢
    • 1970-01-01
    • 2019-01-17
    • 2019-12-10
    • 1970-01-01
    • 1970-01-01
    • 2018-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多