Я получаю ошибку:

Access to XMLHttpRequest at 'https://us-central1-myproject-64732.cloudfunctions.net/getProduct has been blocked by CORS

Мой домен зарегистрирован как example.com.

< Сильный > ИЗМЕНИТЬ

У меня есть :

      const cors = require('cors')({origin: true});
      const rp = require('request-promise');

      exports.getProduct = functions.https.onRequest((request, response) => {    
        const options = {
        uri: url,
        headers: {

        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
        'Accept-Encoding': '*',
        'Accept-Language': 'en-US,en',
        "Access-Control-Allow-Origin":"*",
        'Access-Control-Allow-Methods': 'GET, PUT, POST, OPTIONS',
        'Access-Control-Allow-Headers': '*',
        'Cache-Control': 'max-age=0',
        'Connection': 'keep-alive',
        'Referer': 'http://www.google.com/',
        'Upgrade-Insecure-Requests': '1',
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'
      }
          rp(options)
          .then(($) => { ...

Мой Access-Control-Allow-Origin там, а ошибка говорит, что нет.

< Сильный > EDIT2

Функция работает при использовании на локальной машине, а также в симуляторе терминала, но не работает в браузере.

1
paul seems 7 Май 2020 в 11:26

2 ответа

Попробуй так:

import * as functions_ from 'firebase-functions';
// import * as firebaseHelper from 'firebase-functions-helper';
import * as express_ from 'express';
import * as bodyParser_ from "body-parser";
import News from './news.function';
import Meteo from './meteo.function';

const _cors = require('cors')({
    origin: true,
});

let bodyParser = bodyParser_;
let express = express_;
let functions = functions_;
// const db = admin.firestore();
const app = express();
const main = express();




// YOUR API ROUTES  
app.get('/news/', (req, res) => News(req, res));
app.get('/meteo/', async (req, res) => {
    console.log('here');
    Meteo(req, res)
});

main.use('/api/v1', app);
main.use(bodyParser.json());
main.use(bodyParser.urlencoded({ extended: false }));




// webApi is your functions name, and you will pass main as 
// a parameter
export const webApi = functions.https.onRequest((req, resp) => {
    _cors(req, resp, () => {
        main(req, resp);
    })
});

Надеюсь, это поможет вам!

1
federico scamuzzi 7 Май 2020 в 08:40

Для тех, кто борется, я нашел решение.

exports.getProduct = functions.https.onRequest((request, response) => {

     cors(request, response, () => { // ******  thats solve it

       const options = {
        uri: url,
        headers: { ......

         rp(options)
          .then(($) => { ...

Добавление запроса cors заставляет его работать. Включите библиотеку, конечно. Я также обнаружил, что когда я развертываю одну функцию - она не всегда развертывает ее или создает странные проблемы.

0
paul seems 7 Май 2020 в 13:27