Firebase 云功能:onRequest 和 onCall 之间的区别通话时onRequest
通过文档,我遇到了:
...您可以使用 HTTP 请求或来自客户端的调用直接调用函数。
~ 源
那里(引用中的链接)是关于.functions.https.onCall
但是在这里的教程中,使用了另一个函数,那么我应该使用哪一个函数,为什么?它们之间的区别/相似性是什么?functions.https.onRequest
的文档在这里。functions.https
通过文档,我遇到了:
...您可以使用 HTTP 请求或来自客户端的调用直接调用函数。
~ 源
那里(引用中的链接)是关于.functions.https.onCall
但是在这里的教程中,使用了另一个函数,那么我应该使用哪一个函数,为什么?它们之间的区别/相似性是什么?functions.https.onRequest
的文档在这里。functions.https
这些的官方文档确实很有帮助,但从业余爱好者的角度来看,所描述的差异起初令人困惑。
部署后,这两种类型都分配有唯一的 HTTPS 终结点 URL,并且可以使用 https 客户端直接访问。
但是,在如何称呼它们方面存在一个重要区别。
onCall
:从客户的firebase.functions()
onRequest
:通过标准 https 客户端(例如 JS 中的 API)fetch()
可以直接从客户端应用调用(这也是主要目的)。
functions.httpsCallable('getUser')({uid})
.then(r => console.log(r.data.email))
它是通过用户提供的和自动魔法实现的。data
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
uid
token
输入和对象将自动(取消)序列化。data
response
主要用作快速 API 终结点。
它是用表达式和对象实现的。Request
Response
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))
})
取决于用户提供的授权标头。
您负责输入和响应数据。
客户端的 onCall 和 onRequest 之间的主要区别在于调用它们的方式。当您使用 onCall 定义函数时,例如
exports.addMessage = functions.https.onCall((data, context) => {
// ...
return ...
});
您可以使用firebase函数客户端SDK在客户端调用它,例如
// 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.
});
更多信息关于呼叫: https://firebase.google.com/docs/functions/callable
但是,如果您使用 onRequest 定义函数,例如
exports.addMesssage = functions.https.onRequest((req, res) {
//...
res.send(...);
}
您可以使用普通的JS fetch API调用它(无需在客户端导入firebase函数客户端库),例如
fetch('<your cloud function endpoint>/addMessage').then(...)
这是在决定如何在服务器上定义函数时需要考虑的巨大差异。
更多信息 onRequest: https://firebase.google.com/docs/functions/http-events