将AWS Dynamodb查询结果作为internel服务器错误代码获取:502

时间:2018-04-26 10:35:57

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

这是我的表“odo”:

enter image description here

我想在两个时间戳之间检索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
    }
};

但是我收到错误“内部服务器错误”和错误代码: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网关中测试方法执行的成功结果:

enter image description here

1 个答案:

答案 0 :(得分:2)

问题是您的查询尝试使用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;
};