Going through the docs, I encountered:
...you can call functions directly with an HTTP request or a call from the client.
~ source
The official documentation for those is really helpful, but from the view of an amateur, the described differences were confusing at first.
Can be invoked (and this is also the main purpose) directly from the client app.
functions.httpsCallable('getUser')({uid})
.then(r => console.log(r.data.email))
It is implemented with user-provided data
and automagic context
.
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)
})
})
context
automagically contains metadata about the request such as uid
and token
.data
and response
objects are automatically (de)serialized.It is implemented with express Request
and Response
objects.
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))
})
Read more here Is the new Firebase Cloud Functions https.onCall trigger better?