Поскольку последние несколько недель я получал неожиданные ошибки CORS в консоли браузера, я настроил супер простой сценарий Python с единственной функцией внутри Google Cloud Функции:
def prepData(request):
if request.method == 'OPTIONS':
headers = {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'POST',
'Access-Control-Allow-Headers': 'Content-Type',
'Access-Control-Max-Age': '3600'
}
return ('', 204, headers)
headers = {
'Access-Control-Allow-Origin': '*'
}
return ("", 200, headers)
Это выглядит очень похоже на функцию, представленную Google на их странице документации с одним существенным отличием: я использую POST, а не GET.
При вызове функции я вижу успех сообщение (Function execution took 13 ms, finished with status code: 200
) примерно в 50% случаев и ошибка соединения (Function execution took 11 ms, finished with status: 'connection error'
) во всех остальных случаях. Всякий раз, когда я получаю ошибку соединения внутри GCF, консоль Chrome регистрирует ошибку: No 'Access-Control-Allow-Origin' header is present on the requested resource.
В настоящее время я рассматриваю три возможные причины:
- Инфраструктура GCP. Я нашел несколько связанных вопросов, в которых Google признавал некоторые проблемы с инфраструктурой.
- Python ошибка
- ошибка CORS (пользователь sideshowbarker говорит: очень маловероятно)
Что причина проблемы и как ее исправить?
Вот код JS, который вызывает скрипт Python:
const xhr = new XMLHttpRequest();
xhr.open("POST", "[URL]");
xhr.setRequestHeader("Content-Type", "application/json");
xhr.send(stringified_serialized_data);
Править 4/2/20:
Я обнаружил способ не вызвать ошибку: Добавьте некоторый код между двумя операторами возврата. Я еще не выяснил, какой код нужен, но d = request.get_json()
кажется достаточным. Новый код выглядит следующим образом:
def prepData(request):
if request.method == 'OPTIONS':
headers = {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'POST',
'Access-Control-Allow-Headers': 'Content-Type',
'Access-Control-Max-Age': '3600'
}
return ('', 204, headers)
d = request.get_json() #THIS LINE IS NEW
headers = {
'Access-Control-Allow-Origin': '*'
}
return ("", 200, headers)