Ошибка CORS с функциями Google Firebase, даже если я установил Access-Control-Allow-Origin на сервере - PullRequest
0 голосов
/ 10 ноября 2019

Я получаю следующую ошибку в браузере, когда запускаю свое приложение реагирования на локальном хосте, которое отправляет полезную нагрузку в функцию Google Firebase:

Доступ к выборке в 'https://< myproject> .cloudfunctions. net / 'from origin' http://localhost:3000' заблокирован политикой CORS: в запрошенном ресурсе отсутствует заголовок «Access-Control-Allow-Origin». Если непрозрачный ответ соответствует вашим потребностям, установите режим запроса «no-cors», чтобы получить ресурс с отключенным CORS.

Моя функция Google Firebase имеет следующий код:

exports.<myfunction> = functions.https.onRequest(async (req, res) => {

  res.set('Access-Control-Allow-Origin', 'http://localhost:3000');
  res.set('Access-Control-Allow-Headers', '*');

  console.log(req.body); 

  res.end()
});

Ошибка, которую я получаю в журнале консоли функций firebase:

SyntaxError: Неожиданный токен # в JSON в позиции 0 в JSON.parse () в createStrictSyntaxError (/ worker / node_modules / body-parser / lib /Типы / json.js: 157: 10) при разборе (/worker/node_modules/body-parser/lib/types/json.js:83:15) по адресу /worker/node_modules/body-parser/lib/read.js:121: 18 в invokeCallback (/worker/node_modules/raw-body/index.js:224:16) в готовом (/worker/node_modules/raw-body/index.js:213:7) в IncomingMessage.onEnd (/ worker/node_modules/raw-body/index.js:273:7) в emitNone (events.js: 111: 20) в IncomingMessage.emit (events.js: 208: 7) в endReadableNT (_stream_readable.js: 1064: 12)

Мой код на стороне клиента, который запускает функцию, следующий:

submit(name) {

    fetch('https://< myproject >.cloudfunctions.net/< my function >', {method: 'POST', headers: {"Content-Type": "application/json", 
      },
      body: 'mytoken'
    }).then(result => {console.log(result)}); 
  }

Кроме того, все былоработает отлично всего за несколько минут и дней раньше! Как будто эта ошибка начала появляться из ниоткуда.

1 Ответ

2 голосов
/ 10 ноября 2019

Ваш запрос на выборку отправляет заголовок Content-Type со значением application/json, но тело имеет значение 'mytoken', что не является допустимым JSON. Попробуйте вместо этого отправить что-то вроде {"token":"mytoken"}.

Редактировать: Кроме того, поскольку вы устанавливаете заголовок Content-Type, вы, вероятно, инициируете запрос OPSS перед полетом CORS и можете использовать промежуточное ПО CORS * 1007. * чтобы справиться с этим.

Редактировать 2: Источником ошибки действительно был тот факт, что вместо объекта JSON отправлялась простая строка (а объект JSON был необходим из-за того, чтотип был установлен для приложения / JSON). Однако в послесловии была дополнительная ошибка, заключающаяся в том, что полезную нагрузку JSON нужно было преобразовать в stringify. Соответственно, следующий код для "body" - это то, что заставило все работать успешно:

body: JSON.stringify({token: 'mytoken'})
...