Al revisar los documentos, encontré:
...puede llamar a funciones directamente con una solicitud HTTP o una llamada del cliente .
~ fuente
allí (enlace en la cita) hay una mención sobre functions.https.onCall .
Pero en el tutorial aquí , se usa otra función functions.https.onRequest , entonces, ¿cuál debo usar y por qué? ¿Cuál es la diferencia/similitud entre ellos?
La documentación para functions.https está aquí .
La documentación oficial para ellos es realmente útil, pero desde el punto de vista de un aficionado, las diferencias descritas fueron confusas al principio.
Ambos tipos , cuando se implementan, se asignan con una URL de punto final HTTPS única y se puede acceder a ellos directamente mediante un cliente https.
Sin embargo, hay una diferencia importante en la forma en que se supone que deben llamarse .
onCall : desde firebase.functions() del clienteonRequest : a través del cliente https estándar (por ejemplo fetch() API en JS)Se puede invocar (y este es también el objetivo principal) directamente desde la aplicación del cliente.
functions.httpsCallable('getUser')({uid}) .then(r => console.log(r.data.email)) Se implementa con data proporcionados por el usuario y context automático .
export const getUser = functions.https.onCall((data, context) => { if (!context.auth) return {status: 'error', code: 401, message: 'Not signed in'} return new Promise((resolve, reject) => { // find a user by data.uid and return the result resolve(user) }) }) El context contiene automáticamente metadatos sobre la solicitud, como uid y token .
Los data entrada y los objetos de response se (des) serializan automáticamente.
Sirve principalmente como un punto final de Express API.
Se implementa con objetos de Request y Response express.
export const getUser = functions.https.onRequest((req, res) => { // verify user from req.headers.authorization etc. res.status(401).send('Authentication required.') // if authorized res.setHeader('Content-Type', 'application/json') res.send(JSON.stringify(user)) })Depende de los encabezados de autorización proporcionados por el usuario.
Usted es responsable de los datos de entrada y respuesta.
Lea más aquí ¿Es mejor el nuevo activador https.onCall de Firebase Cloud Functions?
La principal diferencia entre onCall y onRequest para el cliente es la forma en que se invocan. cuando define una función usando onCall, por ejemplo
exports.addMessage = functions.https.onCall((data, context) => { // ... return ... });lo invocas en el lado del cliente usando la función Firebase SDK del cliente, por ejemplo
// on the client side, you need to import functions client lib // then you invoke it like this: const addMessage = firebase.functions().httpsCallable('addMessage'); addMessage({ text: messageText }) .then((result) => { // Read result of the Cloud Function. });más información para onCall: https://firebase.google.com/docs/functions/callable
Pero si define su función usando onRequest, por ejemplo
exports.addMesssage = functions.https.onRequest((req, res) { //... res.send(...); }puede llamarlo usando la API de búsqueda JS normal (no es necesario importar las funciones de firebase client lib en el lado del cliente), por ejemplo
fetch('<your cloud function endpoint>/addMessage').then(...)esta es la gran diferencia que debe tener en cuenta al decidir cómo definir sus funciones en el servidor.
más información para onRequest: https://firebase.google.com/docs/functions/http-events