AWS Lambda с запросом-обещанием - PullRequest
1 голос
/ 26 мая 2019

Я пытаюсь написать лямбда-функцию, которая использует библиотеку запроса-обещания для создания внешнего https-запроса.Вот что у меня есть:

exports.handler = async (event, context, callback) => {
    console.log("Starting call: " + event.queryStringParameters.filter);
    console.log("Decoded param: " + decodeURIComponent(event.queryStringParameters.filter));
    var filter = JSON.parse(decodeURIComponent(event.queryStringParameters.filter));
    console.log("Filter: " + filter);
    var ingredients = filter.ingredients;
    var options = {
        uri: 'https://api.*****.com/search',
        qs: {
            app_id: '****',
            app_key: '*****',
            q: ingredients.join(' ')
        },
        json: true
    };
    console.log("Done calling stuff");

    rp(options)
        .then(function(recipes) {
            console.log('Response: ' + recipes);
            var recipesToReturn = [];

            recipes.hits.forEach(function(recipeHit) {
                recipesToReturn.push(objectMapper(recipeHit.recipe, recipeMap));
            });
            console.log('Recipes:', recipesToReturn);
            const response = {
                statusCode: 200,
                body: JSON.stringify(recipesToReturn),
            };
            return JSON.stringify(response);
        })
        .catch(function(err) {
            console.log('Error:', err)
            const response = {
            statusCode: 400,
            body: err,
            };
            return JSON.stringify(response);
        });
};

Когда я тестирую запрос API-шлюза, я вижу это:

Вс 26 мая 16:59:21 UTC 2019: сбой выполнения из-за конфигурацииошибка: неправильный ответ Lambda-прокси

Я пытался узнать, как должны быть отформатированы ответы Lambda-прокси, и я предполагаю, что мне что-то не хватает в отношении обратного вызова или контекста,но я не смог выяснить, как заставить его работать с библиотекой запроса-обещания.

1 Ответ

1 голос
/ 27 мая 2019

При интеграции через прокси API Gateway просто передает весь запрос и ответ между внешним интерфейсом и внутренним сервером.

Проблема с лямбда-функцией ответа, отправляемой в шлюз API.

Ответ на лямбду должен иметь следующие значения ключа

{
    "isBase64Encoded": true|false,
    "statusCode": httpStatusCode,
    "headers": { "headerName": "headerValue", ... },
    "body": "..."
}

isBase64Encoded : если вы не работаете с двоичными данными, установите для него значение false.

statusCode : ответ HTTP, который интерпретируется API-шлюзом.

body : если вы отправляете JSON, его необходимо преобразовать в строку. В файле node.js вы можете использовать метод JSON.stringify ().

Следующий ответ может быть правильным ответом на API Gateway

const response = {
                statusCode: 200,
                isBase64Encoded: false
                headers:""
                body: JSON.stringify(recipesToReturn),
            };
...