Catch up on everything announced at Firebase Summit, and learn how Firebase can help you accelerate app development and run your app with confidence. Learn More

Wywołaj funkcje za pośrednictwem żądań HTTP

Zadbaj o dobrą organizację dzięki kolekcji Zapisuj i kategoryzuj treści zgodnie ze swoimi preferencjami.

Możesz wyzwolić funkcję za pomocą żądania HTTP, używając functions.https . Dzięki temu można wywołać funkcję synchroniczną za pomocą następujących obsługiwanych metod HTTP: GET , POST , PUT , DELETE i OPTIONS .

Przykłady na tej stronie są oparte na przykładowej funkcji , która jest wyzwalana podczas wysyłania żądania HTTP GET do punktu końcowego funkcji. Przykładowa funkcja pobiera bieżący czas serwera, formatuje czas zgodnie z parametrem zapytania adresu URL i wysyła wynik w odpowiedzi HTTP.

Wyzwól funkcję za pomocą żądania HTTP

Użyj functions.https , aby utworzyć funkcję obsługującą zdarzenia HTTP. Procedura obsługi zdarzeń dla funkcji HTTP nasłuchuje zdarzenia onRequest() , które obsługuje routery i aplikacje zarządzane przez platformę internetową Express .

Używanie ekspresowych obiektów żądania i odpowiedzi

Używany jako argument w onRequest() , obiekt Request daje dostęp do właściwości żądania HTTP wysłanego przez klienta, a obiekt Response daje możliwość wysłania odpowiedzi z powrotem do klienta.

exports.date = functions.https.onRequest((req, res) => {
  // ...
});

Korzystanie z istniejących aplikacji Express

Używając App jako argumentu dla onRequest() , możesz przekazać pełną aplikację Express do funkcji HTTP. Kod standardowy można przenieść do oprogramowania pośredniego, jak pokazano:

const express = require('express');
const cors = require('cors');

const app = express();

// Automatically allow cross-origin requests
app.use(cors({ origin: true }));

// Add middleware to authenticate requests
app.use(myMiddleware);

// build multiple CRUD interfaces:
app.get('/:id', (req, res) => res.send(Widgets.getById(req.params.id)));
app.post('/', (req, res) => res.send(Widgets.create()));
app.put('/:id', (req, res) => res.send(Widgets.update(req.params.id, req.body)));
app.delete('/:id', (req, res) => res.send(Widgets.delete(req.params.id)));
app.get('/', (req, res) => res.send(Widgets.list()));

// Expose Express API as a single Cloud Function:
exports.widgets = functions.https.onRequest(app);

Wywołaj funkcję HTTP

Po wdrożeniu funkcji HTTP można ją wywołać za pomocą jej własnego, unikatowego adresu URL. Adres URL zawiera następujące elementy w kolejności:

  • Region (lub regiony), w którym wdrożono funkcję. Niektóre funkcje produkcyjne mogą wymagać jawnego ustawienia lokalizacji , aby zminimalizować opóźnienie sieci.
  • Twój identyfikator projektu Firebase
  • cloudfunctions.net
  • Nazwa Twojej funkcji

Na przykład adres URL wywołujący date() wygląda następująco:

https://us-central1-<project-id>.cloudfunctions.net/date

Jeśli podczas wdrażania funkcji napotkasz błędy uprawnień, upewnij się, że odpowiednie role IAM są przypisane do użytkownika uruchamiającego polecenia wdrażania.

W przypadku routingu aplikacji Express nazwa funkcji jest dodawana jako prefiks do ścieżek URL w zdefiniowanej aplikacji. Na przykład adres URL do wywołania modułu pobierającego w powyższym przykładzie aplikacji Express wygląda następująco:

https://us-central1-<project-id>.cloudfunctions.net/widgets/<id>

Jeśli wywołujesz funkcje HTTP za zaporą ogniową lub filtrem IP, możesz wyszukać adresy IP używane przez Google do obsługi funkcji HTTP.

Używaj modułów oprogramowania pośredniczącego z Cloud Functions

Jeśli musisz wstrzyknąć zależności oprogramowania pośredniego dla rzeczy takich jak obsługa plików cookie lub CORS, wywołaj je w ramach funkcji. Na przykład, aby włączyć obsługę CORS, dodaj następujący blok:

// Enable CORS using the `cors` express middleware.
cors(req, res, () => {
  // ...
});

Odczytaj wartości z żądania

W poniższej tabeli wymieniono niektóre typowe scenariusze:

Typ zawartości Ciało żądania Zachowanie
application/json '{"name":"John"}' request.body.name równa się „John”
application/octet-stream „mój tekst” request.body równa się „6d792074657874” (nieprzetworzone bajty żądania; zobacz dokumentację Node.js Buffer )
text/plain „mój tekst” request.body równa się „mój tekst”
application/x-www-form-urlencoded „imię = Jan” request.body.name równa się „John”

Ta analiza jest wykonywana przez następujące parsery treści:

Załóżmy, że twoja funkcja jest wywoływana z następującym żądaniem:

curl -X POST -H "Content-Type:application/json" -H "X-MyHeader: 123" YOUR_HTTP_TRIGGER_ENDPOINT?foo=baz -d '{"text":"something"}'

wtedy przesłane dane zmaterializowałyby się pod:

Właściwość/Metoda Wartość
req.method "POCZTA"
req.get('x-myheader') "123"
req.query.foo "baz"
req.body.text "coś"
req.rawBody Surowe (nieprzetworzone) bajty żądania

W przykładzie funkcji date() funkcja testuje zarówno parametr adresu URL, jak i treść pod kątem wartości format , aby ustawić format daty/godziny, który ma być używany:

let format = req.query.format;
format = req.body.format;

Zakończ funkcje HTTP

Zawsze kończ funkcję HTTP za pomocą metody send() , redirect() lub end() . W przeciwnym razie twoja funkcja może nadal działać i zostać wymusiona przez system. Zobacz także Synchronizacja, Asynchronizacja i Obietnice .

Po pobraniu i sformatowaniu czasu serwera za pomocą modułu moment Node.js, funkcja date() kończy wysyłaniem wyniku w odpowiedzi HTTP:

const formattedDate = moment().format(`${format}`);
functions.logger.log('Sending Formatted date:', formattedDate);
res.status(200).send(formattedDate);

Łączenie funkcji HTTP z Hostingiem Firebase

Możesz połączyć funkcję HTTP z Hostingiem Firebase. Żądania w Twojej witrynie Hostingu Firebase mogą być przekazywane do określonych funkcji HTTP. Pozwala to również na użycie własnej domeny niestandardowej z funkcją HTTP. Dowiedz się więcej o łączeniu Cloud Functions z Hostingiem Firebase .