首页 > 解决方案 > AWS Lambda:CORS错误相同的路径但带有参数

问题描述

我在使用cors时遇到了一些问题。当我请求没有参数的 api 时,我没有任何问题。但是当我添加一些参数时,我有一个 cors 错误。

当我调用 /clients 时没有问题,但是当我调用 /clients?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 规则。但我不明白为什么我会遇到这个问题。我遵循了无服务器的所有准则。

标签: aws-lambdacorsserverless-framework

解决方案


这实际上发生在我以前。我尝试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。出于某种原因,它在没有上述标志的情况下对我有用。


推荐阅读