API Gateway -> Lambda -> DynamoDB с использованием Cognito.HTTP POST-> Невозможно прочитать ответ, но возвращает код 200 - PullRequest
0 голосов
/ 18 марта 2019

Сценарий : Я запрашиваю HTTP POST (используя Authorizer в качестве параметра заголовка из Cognito). Когда я пытаюсь получить / прочитать ответ на запрос, он вызывает событие ошибки. Тем не менее, в браузере я вижу, как 2 HTTP POST-ответа с 200 кодами и один из них возвращает действительный ответ. Например: если я сделаю запрос через POST man, я получу данные в 1 ответе хорошим способом.

Задача : Я не могу напечатать результат, потому что он запускает событие ошибки с недопустимыми данными ответа.

Браузер изображений : https://i.postimg.cc/MTMsxZjw/Screenshot-1.png https://i.postimg.cc/3RstwMgv/Screenshot-2.png

Лямбда-код :

'use strict';

var AWS = require('aws-sdk'),
    documentClient = new AWS.DynamoDB.DocumentClient(); 

exports.handler = function index(event, context, callback){
    var params = {
        TableName : "data-table"
    };
    documentClient.scan(params, function(err, data){
        if(err){
            callback(err, null);
        }else{
            console.log(JSON.stringify(data.Items));
            callback(null, data.Items);
        }
    });
}

Код JS на стороне клиента :

function requestData(pickupLocation) {
    $.ajax({
        type: 'POST',
        url: _config.api.invokeUrl,
        headers: {
            Authorization: authToken,
        },
        data: "{}",
        cache: false,
        success: completeRequest,
        error: errorRequest
    });
}

function completeRequest(response) {
    alert("hello");
    alert(response.d);
}

function errorRequest(response) {
    alert("hello1");
    alert(response.status + ' ' + response.statusText);
}

Ответы [ 3 ]

0 голосов
/ 18 марта 2019

Если вы используете хром, вам, вероятно, понадобится плагин cors .

0 голосов
/ 18 марта 2019

Согласно дальнейшим разъяснениям, основанным на комментариях, похоже, что в шлюзе API CORS отключен или включен с неправильными значениями заголовка.

Решение состоит в том, чтобы повторно включить CORS через шлюз API и в дополнительных параметрахдобавьте Access-Control-Allow-Origin к ответу заголовка (если он еще не включен по умолчанию).

0 голосов
/ 18 марта 2019

Если вы передаете ответ, вам нужно следовать определенному формату, как , описанному здесь

    'use strict';
console.log('Loading hello world function');
 
exports.handler = async (event) => {
    let name = "you";
    let city = 'World';
    let time = 'day';
    let day = '';
    let responseCode = 200;
    console.log("request: " + JSON.stringify(event));
    
    // This is a simple illustration of app-specific logic to return the response. 
    // Although only 'event.queryStringParameters' are used here, other request data, 
    // such as 'event.headers', 'event.pathParameters', 'event.body', 'event.stageVariables', 
    // and 'event.requestContext' can be used to determine what response to return. 
    //
    if (event.queryStringParameters && event.queryStringParameters.name) {
        console.log("Received name: " + event.queryStringParameters.name);
        name = event.queryStringParameters.name;
    }
    
    if (event.pathParameters && event.pathParameters.proxy) {
        console.log("Received proxy: " + event.pathParameters.proxy);
        city = event.pathParameters.proxy;
    }
    
    if (event.headers && event.headers['day']) {
        console.log("Received day: " + event.headers.day);
        day = event.headers.day;
    }
    
    if (event.body) {
        let body = JSON.parse(event.body)
        if (body.time) 
            time = body.time;
    }
 
    let greeting = `Good ${time}, ${name} of ${city}. `;
    if (day) greeting += `Happy ${day}!`;

    let responseBody = {
        message: greeting,
        input: event
    };
    
    // The output from a Lambda proxy integration must be 
    // of the following JSON object. The 'headers' property 
    // is for custom response headers in addition to standard 
    // ones. The 'body' property  must be a JSON string. For 
    // base64-encoded payload, you must also set the 'isBase64Encoded'
    // property to 'true'.
    let response = {
        statusCode: responseCode,
        headers: {
            "x-custom-header" : "my custom header value"
        },
        body: JSON.stringify(responseBody)
    };
    console.log("response: " + JSON.stringify(response))
    return response;
};
...