我使用无服务器的yml模板将我的功能部署到aws。以下代码段显示了其中一个端点的配置
functions:
publish:
handler: lambda.publish
events:
- http:
method: post
path: publish
cors:
origin: ${self:custom.origin.${self:custom.stage}}
allowCredentials: true
这是我的获取请求,
fetch(`${SOME_DOMAIN}/publish`, {
method: 'POST',
credentials: 'include',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(data),
})
我正在处理我的lambda中的响应头,就像这样,
const ALLOWED_ORIGINS = [
'http://localhost:3001',
'https://staging.company.com.au',
'https://blaze-staging.company.com.au',
'https://www.company.com.au',
'https://blaze.company.com.au',
'https://direct.company.com.au',
]
const origin = event.headers.origin
let headers
if (ALLOWED_ORIGINS.includes(origin)) {
headers = {
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': origin,
'Access-Control-Allow-Credentials': true,
}
} else {
headers = {
'Access-Control-Allow-Origin': 'http://localhost:3001',
}
}
const response = {
statusCode: 200,
headers,
body: JSON.stringify({ message: 'Successfully published the message.' }),
}
callback(null, response)
由于无法设置多个来源,我无法获得飞行前的请求。如何解决这个问题?设置mode: 'no-cors'
在请求上实际上允许来自任何域的请求。非常感谢任何帮助。
飞行前请求将显示以下错误:
无法加载https://o9a0130i2r.execute-api.us-east-1.amazonaws.com/development/publish: 对预检请求的响应没有通过访问控制检查:否 '访问控制允许来源'标题出现在请求的上 资源。起源' https://direct.company.com'因此是不允许的 访问。响应具有HTTP状态代码403.如果是不透明的响应 满足您的需求,将请求模式设置为“无人”状态。去取 CORS禁用的资源。
答案 0 :(得分:1)
将另一个端点添加到处理发布请求的同一lambda。
cumsum
serverless.yml
您可以将您的起源添加到允许的起源列表中
options:
handler: lambda.options
events:
- http:
method: options
path: publish
现在,当浏览器发出选项请求时,此方法将处理它,如果来自允许的来源或错误,则返回200。您可以根据需要自定义错误消息。