Firebase 云函数: onRequest 和 onCall 的区别

查阅文件时,我遇到了:

你可以通过 HTTP 请求或者 来自客户的电话直接调用函数。

~ 来源

这里提到了 functions.https.onCall

但是在教程 给你中,使用了另一个函数 functions.https.onRequest,那么我应该使用哪个函数? 为什么?他们之间有什么不同/相似之处?

functions.https的文档是 给你

43865 次浏览

正式文件对于这些真的很有帮助,但是从一个业余爱好者的角度来看,所描述的差异一开始是令人困惑的。

  • 部署时,这两种类型 都被分配了唯一的 HTTPS 端点 URL,可以直接使用 HTTPS 客户端访问。

  • 然而,在 应该被称为的方式上有一个重要的区别。

    • 从客户的 firebase.functions()
    • onRequest: 通过标准 https 客户端(例如 JS 中的 fetch() API)

待命

  • 可以直接从客户端应用程序调用(这也是主要目的)。

     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自动地 包含元数据关于请求,例如 uidtoken

  • 输入 dataresponse对象被自动(反)序列化。

OnRequest

  • 请求文件火力基地

  • 主要用作 Express API 端点。

  • 它是用快速 RequestResponse对象实现的。

     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))
    })
    
  • 取决于用户提供的授权头。

  • 您负责输入和响应数据。

在这里阅读更多 新的 Firebase Cloud 函数 https.onCall 触发器是否更好?

对于客户端,待命OnRequest之间的主要区别在于它们的调用方式。 当你使用 待命定义一个函数时。

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.
});

更多关于 onCall 的信息: https://firebase.google.com/docs/functions/callable

但是如果您使用 OnRequest定义函数,例如。

exports.addMesssage = functions.https.onRequest((req, res) {
//...
res.send(...);
}

您可以使用普通的 JS 获取 API 调用它(不需要在客户端导入 firebase 函数 client lib) ,例如。

fetch('<your cloud function endpoint>/addMessage').then(...)

这是在决定如何在服务器上定义函数时需要考虑的最大差异。

更多关于 onRequest 的信息: https://firebase.google.com/docs/functions/http-events