Firebase 云函数:onRequest 和 onCall 之间的区别

IT技术 javascript firebase google-cloud-functions
2021-02-21 05:39:45

通过文档,我遇到了:

...您可以使用 HTTP 请求或来自客户端调用直接调用函数

~来源

那里(引用中的链接)提到了functions.https.onCall.

但是在这里的教程中,使用了另一个函数functions.https.onRequest,那么我应该使用哪个函数,为什么?它们之间有什么区别/相似之处?

对于文档functions.https在这里

2个回答

这些的官方文档确实很有帮助,但从业余爱好者的角度来看,所描述的差异起初令人困惑。

  • 这两种类型在部署时都分配有唯一的 HTTPS 端点 URL,并且可以直接访问。

随传随到

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

    functions.httpsCallable('getUser')({uid})
      .then(r => console.log(r.data.email))
    
  • 它是通过用户提供的dataautomagic 实现的 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对象会自动(反)序列化。

根据要求

  • Firebase onRequest 文档
  • 主要用作 Express API 端点。
  • 它是用 expressRequestResponseobjects 实现的。

    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 Functions https.onCall 触发器更好吗?

是否可以直接从客户端调用注册到 onRequest 的函数,而无需发出 HTTP 请求?
2021-04-20 05:39:45
如何调用 onRequest 函数?或者 onCall 函数是唯一可以从客户端调用的函数?
2021-04-30 05:39:45
@JoseTapizquent 您可以使用fetch()来调用它,它只是一个 API 端点。
2021-05-02 05:39:45
onRequest 创建一个标准的 API 端点,您将使用客户端代码通常使用的任何方法。与它们交互的 HTTP 请求。onCall 创建一个可调用对象。一旦习惯了它们,onCall 的编写工作就会减少,但是您可能无法获得可能习惯的所有灵活性。
2021-05-06 05:39:45
文档说“对于可调用的、Firebase 身份验证令牌、FCM 令牌和 App Check 令牌,如果可用,它们会自动包含在请求中。”,这是否也意味着它onCall是可调用的,onRequest而不是因为你提到的onCall'scontext有关于uidonRequest没有的信息'不。
2021-05-10 05:39:45

客户端的onCallonRequest之间的主要区别在于它们的调用方式。当您使用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