2017-03-21 1 views
3

Serverless 및 AWS에서 다른 CORS 문제가 발생합니다. PUT 메소드를 허용하도록 특별히 말해야 할 필요가있는 것 같지만이 코드가 어디 있는지는 잘 모르겠습니다. 내 람다 함수에 대한 다음과 같은 코드를 가지고 : 나는 점점 오전Serverless 및 PUT 명령의 CORS 문제

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 처리되지 않은 거부 가능성 : { "data": null, "status": -1, "config": { "method": "PUT", "transformRequest" [null], "transformResponse": [null], "jsonpCallbackParam": "콜백", "데이터": {}, "url": "https://pwqlomgq89.execute-api.us-east-1.amazonaws.com/dev/timeoffgroup/7d463800-0935-11e7-b618-4b1d72ddca8e", "params": { "timeOffGroup": "Holiday edited"} , "content-Type": "application/json; charset = utf-8"}}, "statusText": "헤더": { "Accept": "application/json, text/plain, /" "}

CORS가 작동하도록 서버리스 튜토리얼의 모든 호출을 따라했습니다. 하지만 그것은 얻을 수 있고 작동하도록 만드는 것 같지만 PUT 명령이 작동하지 않습니다. 크로스 도메인에서 PUT을 허용하도록 업데이트 명령을 설정해야하는 곳이 있습니까? 헤더 : 당신의 문제는 당신이 OPTIONS 동사를 처리하지 않는 것 같다

{ 
    "Access-Control-Allow-Origin" : "*", // Required for CORS support to work 
    "Access-Control-Allow-Credentials" : true 
} 
+0

당신이 특정 오류 메시지를 얻고있는 이유는 서버가 액세스 제어 - 허용 - 원산지를 추가하도록 구성되지 않은 단지 아마도 :

functions: func: handler: handler.func events: - http: PUT foo/bar - http: OPTIONS foo/bar 

같은 것을 사용하여 핸들을 수정 서버 오류 응답에 대한 응답 헤더. 그 메시지가 나타내는 진짜 근본적인 문제는 서버 측에 502 오류가 있다는 것입니다. 이것은 CORS 구성과 관련이없는 다른 오류가 발생하고 있음을 나타내는 것처럼 보입니다. 따라서 서버 로그를 살펴보고 502 서버 장애를 일으키는 원인에 대한 자세한 정보를 얻고이를 수정할 수 있습니다. 그것은 약간의 문법 오류와 같은 간단한 것일 수 있습니다. – sideshowbarker

+1

그래, "ValidationException : 유효하지 않은 UpdateExpression : 표현식에 사용 된 표현식 속성 값이 정의되지 않았으며, 속성 값 : : timeOffGroupColor"라고 말하는 서버 로그를 보았습니다. 지금 오타를 찾고 있습니다. . –

+0

자바 스크립트에서 정의되지 않은 값이 함수에 전달되었습니다. 이 문제를 해결할 수 있습니다. 도움을 주신 모든 분들께 감사드립니다. –

답변

2

나는 PUT 방식 액세스에 대한 자세한 내용은 여기를해야 할 수도 있습니다처럼

보인다. 이 요구 사항에 대한 자세한 내용은 answer을 참조하십시오.

PUT 요청을하기 전에 브라우저는 서버에서 이러한 종류의 요청이 발생하는지 확인하기 위해 안전 조치로 OPTIONS 요청을 프리 플라이트합니다. OPTIONS을 지원하지 않으면 PUT 요청을하지 않습니다.

이 문제를 해결하려면 serverless.yml 파일을 OPTIONS 지원을 변경하십시오.

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' 
     } 
    }); 
};