Получение результата запроса AWS Dynamodb в виде кода ошибки интернет-сервера: 502 - PullRequest
0 голосов
/ 26 апреля 2018

Это мой стол "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 Gateway:

enter image description here

1 Ответ

0 голосов
/ 26 апреля 2018

Проблема в том, что ваш запрос пытается использовать ключ разделения таблицы deviceid и ключ диапазона timestamp. На самом деле у вас есть ключ разделения с именем id и без ключа диапазона.

Вы можете использовать KeyConditionExpression только для атрибутов, которые являются ключом, который в вашем случае является атрибутом id.

Чтобы выполнить ваш «запрос», вам нужно изменить KeyConditionExpression на FilterExpression и изменить query на scan

EDIT:

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