2017-03-14 8 views
7

Używam funkcji chmury do wywoływania innej funkcji chmury na wolnej warstwie iskier.Wywołanie funkcji chmury z innej funkcji chmurowej

Czy istnieje specjalny sposób wywoływania innej funkcji chmury? A może używasz standardowego żądania http?

Próbowałem wywołanie innej funkcji bezpośrednio tak:

exports.purchaseTicket = functions.https.onRequest((req, res) => {  
    fetch('https://us-central1-functions-****.cloudfunctions.net/validate') 
    .then(response => response.json()) 
    .then(json => res.status(201).json(json)) 
}) 

Ale pojawia się błąd

FetchError: request to https://us-central1-functions- ****.cloudfunctions.net/validate failed, reason: getaddrinfo ENOTFOUND us-central1-functions-*****.cloudfunctions.net us-central1-functions-*****.cloudfunctions.net:443

co brzmi jak Firebase blokuje połączenia, mimo że jest to google własnością, i dlatego nie należy go blokować:

the Spark plan only allows outbound network requests to Google owned services.

Jak mogę skorzystać z Cloud Func do połączenia się z inną funkcją chmury?

Odpowiedz

4

Nie musisz przechodzić przez problemy związane z wywoływaniem niektórych funkcji współdzielonych za pomocą zupełnie nowego połączenia HTTPS. Możesz po prostu oddzielić wspólne fragmenty kodu do zwykłej funkcji javascript, która zostanie wywołana przez jeden z nich. Na przykład, można zmodyfikować funkcję szablonu helloworld tak:

var functions = require('firebase-functions'); 

exports.helloWorld = functions.https.onRequest((request, response) => { 
    common(response) 
}) 

exports.helloWorld2 = functions.https.onRequest((request, response) => { 
    common(response) 
}) 

function common(response) { 
    response.send("Hello from a regular old function!"); 
} 

Te dwie funkcje zrobi dokładnie to samo, ale z różnych punktów końcowych.

+2

Jeśli z jakiegoś powodu potrzebujesz funkcji "stopniowanych" (powiedz, że wykonujesz serię żądań HTTP stron trzecich). Proponuję opublikowanie w [Cloud Pub/Sub] (https://github.com/GoogleCloudPlatform/google-cloud-node#cloud-pubsub-alpha), które może asynchronicznie wywołać funkcję [Cloud Pub/Sub] (https: //firebase.google.com/docs/functions/pubsub-events). Wyzwalacze HTTP są zsynchronizowane, mają limit czasu i nie są "trwałe". –

+0

Dzięki Doug. To odpowiada na moje pierwsze i główne pytanie. Czy możesz mi powiedzieć, dlaczego nie mogłem wykonać połączenia http do * .cloudfunctions.net? Powodem, dla którego zostałem nazwany inną funkcją chmury, było symulowanie zewnętrznego wywołania API do API hostowanego w usłudze innej niż google. –

+0

* .cloudfunctions.net nie znajduje się obecnie na białej liście dla dostępu do sieci w darmowej warstwie Spark. Ogólnie rzecz biorąc, stosowanie białej listy ma na celu zapobieganie przypadkowemu wykorzystywaniu usług innych niż google i możesz myśleć o * .cloudfunctions.net jako o usługach innych niż google (ponieważ programiści tacy jak ty faktycznie udostępniają tę całą przestrzeń, aby zapewnić własną). –