我遇到了无服务器和AWS的另一个CORS问题。似乎我需要特别告诉它允许PUT方法,但我不确定这个代码在哪里。我的Lambda函数有以下代码:
module.exports.update = (event, context, callback) => {
const timestamp = new Date().getTime();
const data = JSON.parse(event.body);
if (typeof event.pathParameters.timeoffgroupid !== 'string') {
console.error('Validation Failed');
callback(new Error('Couldn\'t update the todo item.'));
return;
}
const params = {
TableName: 'TimeOffGroup',
Key: {
timeoffgroupid: event.pathParameters.timeoffgroupid,
},
ExpressionAttributeValues: {
':timeOffGroup': data.timeOffGroup,
':timeOffGroupColor': data.timeOffGroupColor,
':dateModified': timestamp
},
UpdateExpression: 'SET timeOffGroup = :timeOffGroup, timeOffGroupColor = :timeOffGroupColor, dateModified = :dateModified',
ReturnValues: 'ALL_NEW',
};
dynamoDb.update(params, (error, result) => {
if (error) {
console.error(error);
callback(new Error('Couldn\'t update the todo item.'));
return;
}
const response = {
statusCode: 200,
body: JSON.stringify(result.Attributes),
headers: {
"Access-Control-Allow-Origin" : "*", // Required for CORS support to work
"Access-Control-Allow-Credentials" : true
}
};
callback(null, response);
});
};
我得到的错误是:
XMLHttpRequest无法加载 https://pwqlomgq89.execute-api.us-east-1.amazonaws.com/dev/timeoffgroup/7d463800-0935-11e7-b618-4b1d72ddca8e?timeOffGroup=Holiday+edited。 请求中不存在“Access-Control-Allow-Origin”标头 资源。因此不允许来源“http://localhost:9000” 访问。响应具有HTTP状态代码502.angular.js:14328 可能是未处理的拒绝: { “数据”:NULL, “状态”: - 1, “配置”:{ “方法”: “PUT”, “transformRequest”:[空], “transformResponse”:[空], “jsonpCallbackParam”: “回调” “数据”:{}, “URL”: “https://pwqlomgq89.execute-api.us-east-1.amazonaws.com/dev/timeoffgroup/7d463800-0935-11e7-b618-4b1d72ddca8e”, “PARAMS”:{ “timeOffGroup”:“假日 编辑“},”标题“:{”接受“:”application / json,text / plain, / ”, “内容类型”: “应用/ JSON;字符集= UTF-8”}}, “状态文本”: “”}
我已经完成了对无服务器教程的所有调用,以使CORS正常工作。但似乎我得到了get和create,但是PUT命令不起作用。我是否需要设置更新命令以允许跨域的PUT?
看起来我可能需要更多PUT方法访问权限: 标题:
{
"Access-Control-Allow-Origin" : "*", // Required for CORS support to work
"Access-Control-Allow-Credentials" : true
}
答案 0 :(得分:2)
您的问题似乎是您没有处理OPTIONS
动词。请参阅此answer以了解有关此要求的更多信息。
在发出PUT
请求之前,浏览器将预检OPTIONS
请求作为安全措施,以确保服务器期望此类请求。如果您不支持OPTIONS
,则不会发出PUT
请求。
要解决此问题,请更改 serverless.yml 文件以添加OPTIONS
支持。
functions:
func:
handler: handler.func
events:
- http: PUT foo/bar
- http: OPTIONS foo/bar
使用以下内容修改句柄:
module.exports.func = (event, context, callback) => {
try {
switch(event.httpMethod + ' ' + event.resource) {
case 'PUT /foo/bar':
handlePut(callback);
break;
case 'OPTIONS /foo/bar':
handleOptions(callback);
break;
default:
// return HTTP 400
}
}
catch (err) {
// return HTTP 500
}
};
const handlePut = (callback) => {
callback(null, {
statusCode: 200,
headers: {
'Access-Control-Allow-Origin': '*'
},
body: JSON.stringify({
message: 'PUT'
})
});
};
const handleOptions = (callback) => {
callback(null, {
statusCode: 200,
headers: {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Headers': 'origin, content-type, accept',
'Access-Control-Allow-Methods': 'POST, PUT, OPTIONS'
}
});
};
答案 1 :(得分:0)
您可以尝试通过增加Lambda超时来尝试。这解决了我的CORS问题。