aws-lambda - 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 规则。但我不明白为什么我会遇到这个问题。我遵循了无服务器的所有准则。
解决方案
这实际上发生在我以前。我尝试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。出于某种原因,它在没有上述标志的情况下对我有用。
推荐阅读
- c++ - 用 std::string 和 std::wstring 对象写入同一个文件
- automation - 如何使用 OxygenHQ 在 IE 浏览器中运行测试?
- wordpress - 在主题选项中使用容器分隔字段数组(碳字段)
- javascript - Javascript检测悬停是在元素的底部还是顶部填充
- javascript - 是否可以在 PM2 日志中插入字符串?
- javascript - jquery/ajax加载href onClick获取多个链接
- macos - 无法在 Mac OS High Sierra 上安装 VirtualBox
- python - 进入全屏时屏幕大小不更新
- terraform - Terraform 计划打印敏感信息
- c# - 在 SQL 中加密和在 C# 中解密