AWS Лямбда: ошибки CORS по тому же пути, но с параметрами - PullRequest
1 голос
/ 11 января 2020

У меня проблемы с корсом. Когда я запрашиваю свой API без параметров, у меня нет проблем. Но когда я добавляю некоторые параметры, у меня возникают ошибки cors.

Когда я звоню / клиентам нет проблем, но когда я делаю / клиенты? Filter = {"acheteur": "1"}, я получаю Raison : l’en-tête CORS « Access-Control-Allow-Origin » est manquant., что означает отсутствует

Вот мой serverless.yml:

clientsGetList:
    handler: functions/clients/getList.main
    events:
      - http:
          path: /clients
          method: get
          cors: true
          request:
            parameters:
              paths:
                filter: false
                sort: false
                range: false

Вот мой код:

import { success, failure } from "../../libs/response-lib";
import { AuroraDB } from '../../libs/aurora-lib';

export async function main(event, context, callback) {
    try {
        const params = event.queryStringParameters;
        var query = `SELECT * from Clients`;
        if (params) {
            if (params.filter != null) {
                // Filter example: filter={"vip":"Normal", "denomination":"Stanislas Girard", "vendeur": "false"}
                query += " WHERE ";
                const filters = JSON.parse(params.filter);
                var number = 0;
                for (const filt in filters) {
                    if (!Array.isArray(filters[filt])) {
                        if (number != 0) { query += " AND "; }
                        number++;
                        if (filters[filt] == "true" || filters[filt] == "false") {
                            query += filt + " IS " + filters[filt] + " ";
                        } else {
                            query += filt + " LIKE '" + filters[filt] + "' ";
                        }
                    } else {
                        if (number != 0) { query += " AND "; }
                        number++;
                        query += filt + " IN " + "(";
                        const arr = filters[filt];
                        var number2 = 0;
                        for (var val in arr){
                            var el = val;
                            if (number2 != 0) {
                                query += ",";
                            }
                            if (typeof arr[val] === 'string') {
                                 el = "'" + arr[val] + "'";
                            }
                            query += el;
                            number2++;
                        }
                        query += ") ";
                    }
                }
            }
            if (params.sort != null) {
                // sort example: sort=["identifier","DESC"]
                const sort = JSON.parse(params.sort);
                query += "ORDER BY " + sort[0] + " " + sort[1] + " ";
            }
            if (params.range != null) {
                //range example: range=[0, 1]
                const range = JSON.parse(params.range);
                query += " LIMIT " + range[0] + " , " + range[1];
            }
        }
        let result = await AuroraDB.query(query);
        return success({ status: true, result: result, lol: "Prout" });
    } catch (e) {
        return failure({ status: false, result: "", error: e });
    }
}

А вот мой ресурс, импортированный с обработанными ошибками APIGateway cors

Resources:
  GatewayResponseDefault4XX:
    Type: 'AWS::ApiGateway::GatewayResponse' 
    Properties:
      ResponseParameters: 
        gatewayresponse.header.Access-Control-Allow-Origin: "'*'" 
        gatewayresponse.header.Access-Control-Allow-Headers: "'*'"
      ResponseType: DEFAULT_4XX 
      RestApiId:
        Ref: 'ApiGatewayRestApi' 
  GatewayResponseDefault5XX:
    Type: 'AWS::ApiGateway::GatewayResponse' 
    Properties:
      ResponseParameters: 
        gatewayresponse.header.Access-Control-Allow-Origin: "'*'"
        gatewayresponse.header.Access-Control-Allow-Headers: "'*'"
      ResponseType: DEFAULT_5XX 
      RestApiId:
        Ref: 'ApiGatewayRestApi'

И код, который создает ответ:

export function success(body)
{
    return buildResponse(200, body);
}
export function failure(body)
{
    return buildResponse(500, body);
}
function buildResponse(statusCode, body) { return {
    statusCode: statusCode,
    headers: {
        'Access-Control-Allow-Origin': '*', // Required for CORS support to work
        'Access-Control-Allow-Credentials': true // Required for cookies, authorization headers with HTTPS
    },
body: JSON.stringify(body) };
}

У меня нет проблем с вызовом Postman, что нормально, поскольку Postman не применяет правила CORS. Но я не могу понять, почему у меня такие проблемы. Я следовал всем инструкциям без сервера.

1 Ответ

0 голосов
/ 14 января 2020

Это на самом деле произошло со мной ранее. Я попытался добавить integration: lambda к serverless.yml следующим образом:

clientsGetList:
    handler: functions/clients/getList.main
    events:
      - http:
          path: /clients
          method: get
          cors: true
          integration: serverless
          request:
            parameters:
              paths:
                filter: false
                sort: false
                range: false

Посмотрите, работает ли это для вас. Вы также можете попробовать удалить cors: true. По какой-то причине у меня это работает без указанного флага.

...