API-функции Firebase заблокированы политикой CORS - PullRequest
0 голосов
/ 02 мая 2020

У меня есть некоторые облачные функции Firebase, которые я вызываю из приложения React. Localhost to localhost работает нормально, но когда я пытаюсь связаться с развернутой версией облачных функций (как с моего localhost, так и из моего развернутого приложения React), я получаю сообщение об ошибке CORS:

Access to XMLHttpRequest at 'https://us-xxxxxxxxxxxxx.cloudfunctions.net/api/login' from origin 'http://localhost:3000' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.

Вот функции index.js:

const functions = require("firebase-functions");
const cors = require('cors');
const app = require("express")();
app.use(cors({ origin: true }));

const {
  signup,
  login,
  loginAdmin,
  getUserData,
} = require("./handlers/users");

...
app.post("/login", login);
....
exports.api = functions.https.onRequest(app);

Вот что я пытаюсь добавить к функции входа в систему:

exports.login = async (req, res) => {
  res.set('Access-Control-Allow-Origin', "*"); // added this line
  // actual function is irrelevant

, но это не сработало, поэтому я тоже попробовал это:

exports.login = async (req, res) => {
  console.log('outside')
  return await cors(req, res, async () => {
    console.log('inside')
    // function code....

Но в этом случае функция зависает, из консоли я вижу, что она печатает outside, но не inside.

Код переднего плана такой же, поэтому я сомневаюсь в проблеме там ...

Как это исправить?

РЕДАКТИРОВАТЬ:

Благодаря ответам я добавил эту строку кода в index.js:

const functions = require("firebase-functions");
const cors = require('cors');
const app = require("express")();
app.use(cors({ origin: true }));
app.options('/login', cors()) // <- this one

const {
  signup,
  login,
  loginAdmin,
  getUserData,
} = require("./handlers/users");

...
app.post("/login", login);
....
exports.api = functions.https.onRequest(app);

Все еще не повезло, я развернул снова, но у меня та же ошибка.

1 Ответ

0 голосов
/ 02 мая 2020

В сообщении об ошибке указывается:

предпечатный запрос

, который, как MDN говорит , является запросом OPTIONS.

Вы только привязываете свой код, который устанавливает Access-Control-Allow-Origin к обработчику для запроса POST.

Документация для используемого модуля cors объясняет, как настроить код для запрос перед полетом.

Один из примеров:

app.options('/products/:id', cors()) // enable pre-flight request for DELETE request
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...