2017-03-13 24 views
20

Aktualnie uczę się korzystać z nowych funkcji chmurowych w Firebase, a problem, który mam, polega na tym, że nie mogę uzyskać dostępu do funkcji, którą napisałem za pomocą żądania AJAX. Otrzymuję błąd "Nie" Access-Control-Allow-Origin ". Oto przykład funkcji I napisał:Włączanie CORS w funkcjach chmurowych dla Firebase

exports.test = functions.https.onRequest((request, response) => { 
    response.status(500).send({test: 'Testing functions'}); 
}) 

Funkcja siedzi w tym URL: https://us-central1-fba-shipper-140ae.cloudfunctions.net/test

Firebase docs sugeruje, aby dodać CORS middleware wewnątrz funkcji, próbowałem, ale to nie działa na mi: https://firebase.google.com/docs/functions/http-events

to jak to zrobiłem:

var cors = require('cors');  

exports.test = functions.https.onRequest((request, response) => { 
    cors(request, response,() => { 
    response.status(500).send({test: 'Testing functions'}); 
    }) 
}) 

Co robię źle? Byłbym wdzięczny za każdą pomoc.

UPDATE:

Doug Stevenson „s odpowiedź pomogła. Dodanie ({origin: true}) rozwiązało problem, musiałem również zmienić response.status(500) na response.status(200), którego na początku zupełnie mi brakowało.

+0

także próbkę w docs [tutaj] (https://firebase.google.com/docs/ hosting/url-redirects-przepisuje # nagłówki sekcji) – Kato

Odpowiedz

47

Istnieją dwa sample functions świadczone przez zespół Firebase które demonstrują użycie CORS:

Druga próba wykorzystuje inny sposób pracy z Cors niż ty "Obecnie używam.

także rozważyć importowanie tak, jak pokazano w próbkach:

const cors = require('cors')({origin: true}); 
+0

Dziękujemy! Pomocne było dodanie ({origin: true}). –

+0

Miło, na pewno potrzebujesz 'origin: true', ponieważ opuszczenie go spowoduje, że to nie zadziała – Scott

+0

Wygląda na to, że zdefiniowano białą domenę domen umożliwiającą dostęp? A ustawienie "origin: true" pozwala na dostęp do dowolnej domeny? (https://www.npmjs.com/package/cors) @Doug Stevenson Czy uważasz, że firebase może napisać dokument na temat podstaw potrzebnych dla funkcji https klienta/serwera? Repozytorium próbek jest dobre, ale przegapiliśmy ten dodatkowy element wymagający. –

5

Jedna dodatkowa informacja, tylko dla tych, którzy szukają go po pewnym czasie: Jeśli korzystasz z hostingu Firebase, możesz również ustawić przepisywanie, aby na przykład adres URL podobny do (firebase_hosting_host)/api/funkcja myfunction przekierowuje do funkcji (firebase_cloudfunctions_host)/doStuff. W ten sposób, ponieważ przekierowanie jest przejrzyste i po stronie serwera, nie musisz zajmować się corsami.

Można ustawić, że się z sekcją przepisuje w firebase.json:

"rewrites": [ 
     { "source": "/api/myFunction", "function": "doStuff" } 
] 
2

Mam mały dodatek do @Andreys odpowiedzi na własne pytanie.

Wygląda na to, że nie trzeba wywoływać tego wywołania zwrotnego w funkcji, więc można po prostu wywołać moduł cors na górze funkcji, bez osadzania całego kodu w wywołaniu zwrotnym. Jest to znacznie szybsze, jeśli chcesz później zaimplementować cors.

exports.exampleFunction = functions.https.onRequest((request, response) => { 
    cors(request, response,() => {}); 
    return response.send("Hello from Firebase!"); 
}); 

Nie zapomnij init Cors jak wspomniano w poście otwierającym:

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

Powiązane problemy