【问题标题】:Firebase Cloud Functions: Difference between onRequest and onCallFirebase 云函数:onRequest 和 onCall 之间的区别
【发布时间】:2018-12-06 13:33:41
【问题描述】:

浏览文档,我遇到了:

...您可以使用 HTTP 请求或 call from the client 直接调用函数。

~source

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

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

functions.https 的文档是 here

【问题讨论】:

  • 谢谢@DougStevenson,但我在问这个问题之前已经阅读了这个问题,它并没有帮助我更好地理解这个话题。
  • 我不认为还有什么要理解的。您的具体困惑是什么?
  • @DougStevenson 首先,调用这些函数的方式似乎有所不同。一个通过 url,另一个使用应用内调用。
  • @DougStevenson 你能检查我的答案是否有可能的错误吗?谢谢!

标签: javascript firebase google-cloud-functions


【解决方案1】:

official documentation 确实很有帮助,但从业余爱好者的角度来看,所描述的差异起初令人困惑。

  • 两种类型在部署时都分配有唯一的 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 自动contains metadata 关于请求,例如uidtoken
  • 输入 dataresponse 对象会自动(反)序列化。

onRequest

  • Firebase onRequest Docs
  • 主要用作 Express API 端点。
  • 使用 express 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))
    })
    
  • 取决于用户提供的授权标头。
  • 您负责输入和响应数据。

在此处阅读更多信息Is the new Firebase Cloud Functions https.onCall trigger better?

【讨论】:

  • 如何调用 onRequest 函数?或者 onCall 函数是唯一可以从客户端调用的函数?
  • @JoseTapizquent 您可以使用fetch() 调用它,它只是一个API 端点。
  • onRequest 创建一个标准的 API 端点,您将使用客户端代码通常使用的任何方法。与它们交互的 HTTP 请求。 onCall 创建一个可调用对象。一旦你习惯了它们,onCall 的编写工作就会少一些,但你并没有你可能习惯的所有灵活性。
  • 是否可以直接从客户端调用注册了onRequest的函数,而不用发起HTTP请求?
  • Docs 说“使用可调用对象、Firebase 身份验证令牌、FCM 令牌和应用检查令牌(如果可用)会自动包含在请求中。”,这是否也意味着 onCall 是可调用的并且 @987654339 @ 不是因为你提到onCallcontext 有关于uid 的信息,但onRequest 没有。
【解决方案2】:

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

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

但是如果你使用 onRequest 来定义你的函数,例如

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2022-09-26
    • 2019-11-16
    • 1970-01-01
    • 2020-12-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-03
    • 2021-04-10
    • 2018-11-02
    相关资源
    最近更新 更多