Firebase 云函数:onRequest 和 onCall 之间的区别
IT技术
javascript
firebase
google-cloud-functions
2021-02-21 05:39:45
2个回答
这些的官方文档确实很有帮助,但从业余爱好者的角度来看,所描述的差异起初令人困惑。
- 这两种类型在部署时都分配有唯一的 HTTPS 端点 URL,并且可以直接访问。
随传随到
可以直接从客户端应用程序调用(这也是主要目的)。
functions.httpsCallable('getUser')({uid}) .then(r => console.log(r.data.email))
它是通过用户提供的
data
和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
自动的包含元数据有关请求如uid
和token
。 - 输入
data
和response
对象会自动(反)序列化。
根据要求
- Firebase onRequest 文档
- 主要用作 Express API 端点。
它是用 express
Request
和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)) })
- 取决于用户提供的授权标头。
- 您负责输入和响应数据。
客户端的onCall和onRequest之间的主要区别在于它们的调用方式。当您使用onCall定义函数时,例如
exports.addMessage = functions.https.onCall((data, context) => {
// ...
});
您使用 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.
});
有关 onCall 的更多信息: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
其它你可能感兴趣的问题