В настоящее время я изучаю, как использовать новые облачные функции для Firebase, и проблема, с которой я сталкиваюсь, заключается в том, что я не могу получить доступ к функции, которую я написал через запрос AJAX. Я получаю ошибку "Нет 'Access-Control-Allow-Origin'". Вот пример функции, которую я написал:
exports.test = functions.https.onRequest((request, response) => {
response.status(500).send({test: 'Testing functions'});
})
Функция находится в этом URL: https://us-central1-fba-shipper-140ae.cloudfunctions.net/test
Firebase docs предлагает добавить в функцию промежуточное ПО CORS, я пробовал, но у меня это не работает: https://firebase.google.com/docs/functions/http-events
Вот как я это сделал:
var cors = require('cors');
exports.test = functions.https.onRequest((request, response) => {
cors(request, response, () => {
response.status(500).send({test: 'Testing functions'});
})
})
Что я делаю не так? Буду признателен за любую помощь в этом.
ОБНОВИТЬ:
Ответ Дуга Стивенсона помог. Добавление ({происхождение: истинно}) Исправлена проблема, я также имел изменения response.status(500)
в response.status(200)
который я полностью пропустил в первый.
источник
Ответы:
Команда Firebase предоставляет две примеры функций , демонстрирующих использование CORS:
Во втором примере используется другой способ работы с сердечниками, чем в настоящее время.
Также рассмотрите возможность импорта следующим образом, как показано в примерах:
источник
origin: true
как если вы пропустите это, это не сработаетorigin: true
позволяет доступ к любому домену? ( npmjs.com/package/cors ) @Doug Stevenson Как вы думаете, firebase мог бы написать документ по основам, необходимым для функций https клиента / сервера? Репозиторий сэмплов хорош, но мы упустили это дополнительное требование.Вы можете установить CORS в облачной функции следующим образом
response.set('Access-Control-Allow-Origin', '*');
Нет необходимости импортировать
cors
пакетисточник
Authorization
заголовок. Выше, кажется, работает нормально.Для тех, кто пытается сделать это в Typescript, это код:
источник
Еще одна дополнительная информация, просто для тех, кто через некоторое время погуглил: если вы используете хостинг firebase, вы также можете настроить перезапись, так что, например, URL-адрес (firebase_hosting_host) / api / myfunction перенаправляется на ( firebase_cloudfunctions_host) / функция doStuff. Таким образом, поскольку перенаправление является прозрачным и выполняется на стороне сервера, вам не придется иметь дело с корсами.
Вы можете настроить это с помощью раздела перезаписи в firebase.json:
источник
Никакие решения CORS у меня не работали ... до сих пор!
Не уверен, что кто-то еще столкнулся с той же проблемой, что и я, но я настроил CORS 5 разными способами из примеров, которые я нашел, и, похоже, ничего не работало. Я создал минимальный пример с Plunker, чтобы проверить, действительно ли это ошибка, но пример работал прекрасно. Я решил проверить журналы функций firebase (найденные в консоли firebase), чтобы узнать, может ли это мне что-нибудь сказать. У меня было несколько ошибок в коде моего узла сервера , не связанных с CORS , которые при отладке освободили меня от сообщения об ошибке CORS . Я не знаю, почему ошибки кода, не связанные с CORS, возвращают ответ об ошибке CORS, но это привело меня к неправильной кроличьей норе в течение хорошего количества часов ...
tl; dr - проверьте журналы функций firebase, если никакие решения CORS не работают, и отладьте любые ошибки, которые у вас есть
источник
Error: quota exceeded (Quota exceeded for quota group 'NetworkIngressNonbillable' and limit 'CLIENT_PROJECT-1d' of service 'cloudfunctions.googleapis.com
так, что в основном бесплатная квота была превышена, и функции вернули ошибкуaccess to external network resources not allowed if the billing account is not enabled
. После включения биллинговой учетной записи он работает отлично. Это также один из примеров, не связанных с cors, но выдается ошибка cors.У меня есть небольшое дополнение к ответу @Andreys на его собственный вопрос.
Кажется, что вам не нужно вызывать обратный вызов в
cors(req, res, cb)
функции, поэтому вы можете просто вызвать модуль cors в верхней части вашей функции, не вставляя весь свой код в обратный вызов. Это будет намного быстрее, если вы захотите впоследствии реализовать cors.Не забудьте инициализировать cors, как указано во вводном сообщении:
const cors = require('cors')({origin: true});
источник
cors(request, response, () => { return response.send("Hello from Firebase!"); });
Это может быть полезно. Я создал облачную функцию HTTP firebase с помощью экспресс (настраиваемый URL)
Убедитесь, что вы добавили разделы перезаписи
источник
Я только что опубликовал небольшую статью об этом:
https://mhaligowski.github.io/blog/2017/03/10/cors-in-cloud-functions.html
Как правило, вы должны использовать пакет Express CORS , который требует небольшого взлома, чтобы соответствовать требованиям в функциях GCF / Firebase.
Надеюсь, это поможет!
источник
Если есть люди вроде меня: если вы хотите вызвать облачную функцию из того же проекта, что и сама облачная функция, вы можете запустить sdk firebase и использовать метод onCall. Он сделает все за вас:
Вызовите эту функцию так:
Документы Firebase: https://firebase.google.com/docs/functions/callable
Если вы не можете запустить SDK, вот суть других предложений:
источник
Нашел способ включить cors без импорта какой-либо библиотеки cors. Он также работает
Typescript
и тестировался в Chrome версии 81.0.источник
Как бы то ни было, при переходе
app
вonRequest
. Я понял, что проблема заключалась в косой черте в конце URL-адреса запроса для функции firebase. Express искал,'/'
но у меня не было косой черты в конце функции[project-id].cloudfunctions.net/[function-name]
. Ошибка CORS была ложноотрицательной. Когда я добавил косую черту в конце, я получил ожидаемый ответ.источник
[project-id]
как это была проблема, с которой я столкнулсяУ меня работает только этот способ, поскольку в моем запросе есть разрешение:
источник
Если вы не используете / не можете использовать плагин cors, вызов
setCorsHeaders()
функции первым делом в функции-обработчике также будет работать.При ответе также используйте функции responseSuccess / Error.
источник
Если вы тестируете приложение Firebase локально, вам нужно указать функции
localhost
вместо облака. По умолчаниюfirebase serve
илиfirebase emulators:start
указывает функции на сервер, а не на localhost, когда вы используете его в своем веб-приложении.Добавьте ниже скрипт в заголовок html после скрипта инициализации firebase:
источник
Изменение
true
от"*"
сделал трюк для меня, так это то , как он выглядит:Я пробовал этот подход, потому что, как правило, этот заголовок ответа устанавливается следующим образом:
Имейте в виду, что это позволит любому домену вызывать ваши конечные точки, поэтому это НЕ безопасно.
Кроме того, вы можете прочитать больше в документации: https://github.com/expressjs/cors
источник
Если вы не используете Express или просто хотите использовать CORS. Следующий код поможет решить
источник
В моем случае ошибка была вызвана ограничением доступа к облачной функции. Пожалуйста, добавьте всех пользователей в вызывающий облачные функции. Пожалуйста, поймите ссылку . Пожалуйста, обратитесь к статье для получения дополнительной информации
источник
Если ни одно из других решений не работает, вы можете попробовать добавить указанный ниже адрес в начале вызова, чтобы включить CORS - перенаправление:
Пример кода с запросом JQuery AJAX:
источник
Добавляю свой опыт. Я часами пытался понять, почему у меня возникла ошибка CORS.
Бывает, что я переименовал свою облачную функцию (самое первое, что пробовал после большого обновления).
Поэтому, когда мое приложение firebase вызывало облачную функцию с неправильным именем, оно должно было выдать ошибку 404, а не ошибку CORS.
Исправление имени облачной функции в моем приложении firebase устранило проблему.
Я заполнил отчет об этом здесь https://firebase.google.com/support/troubleshooter/report/bugs
источник