【问题标题】:Firebase Callable Function: Response for preflight in invalidFirebase 可调用函数:预检响应无效
【发布时间】:2019-03-18 10:27:02
【问题描述】:

我创建了一个 Firebase 可调用函数,返回一个简单的文本,但是当我在本地和部署的应用程序上调用该函数时收到错误消息。

callable 函数是一个返回一些文本的简单函数:

exports.getSomeInfo = functions.https.onCall(async (data, context) => {
  return 'some info';
});

在我的应用程序中,我加载函数:

const getSomeInfo = firebase.functions().httpsCallable('getSomeInfo');

并在应用程序中调用它:

getSomeInfo();

这会产生以下错误:

Failed to load https://us-central1-[project-ID].cloudfunctions.net/getSomeInfo: Response for preflight is invalid (redirect)

在本地使用 firebase serve 和已部署的应用程序调用函数时会发生此错误。

在 Firebase 控制台中查看日志没有显示任何日志或错误。

其他问题提到这可能是 CORS 问题或不正确的 Firebase 配置。我已确保 Firebase 配置正确。并尝试了一些CORS解决方案,但继续收到上述错误。

使用 Firebase@5.5.2。

还有什么可能导致此错误?

【问题讨论】:

    标签: firebase google-cloud-functions


    【解决方案1】:

    2020 年 4 月,我刚刚学会了可调用函数在模块名称前加前缀的艰难方法......

    在 index.js 中:

    const functions = require('firebase-functions')
    
    // ...
    exports.callable = require('./callable')
    

    在 callable.js 中:

    const functions = require('firebase-functions');
    // ... other stuff
    exports.myCloudFunction = functions.https.onCall((data, context) => {
      // ...
    

    从 JS 客户端调用这个“myCloudFunction”的方法是使用它的名字,加上它的模块名,像这样

    const fn = firebase.functions().httpsCallable("callable-myCloudFunction")
    fn().then(result => { //...
    

    据我所知,这在任何地方都没有记录,而且正如其他人所提到的,在实际执行云功能之前发生的几乎所有错误最终都会被错误地标记为 CORS 错误。

    【讨论】:

    • 我在此页面上是因为部署后,我的云功能无法正常工作。然而,在函数模拟器中,一切都运行良好,无需预先添加模块名称。生产服务器与功能模拟器不同的任何原因?
    • @krummens - 我能够成功地打开和关闭函数(大部分是关闭的)。我被 https.onCall (以及相关文档,以及此处和其他地方不清楚的一半答案)弄得一头雾水,以至于我完全放弃了使用它们(包括最近的一次测试,就像你一样,我以为我已经知道了在仿真中只能在生产中使用 CORS 失败)。现在,我一直在使用快速中间件和客户端上的一些自制调用基础设施依赖 https.onRequest() 函数(到目前为止取得了成功)。这在在线任何地方的端到端描述也很糟糕
    • 如果您愿意,请提出相关问题并在此处显示链接,我将发布我的解决方案。
    • 花了很多时间使用onCall 进行开发,我希望有一个比为onRequest 重写更简单的解决方案。
    • @krummens - 祝你好运和 lmk 如果你得到这个排序。我很乐意使用 onCall(和赏金答案),它可以在模拟器和生产环境中进行完整的堆栈往返,并继续工作。我想我有 onRequest (我围绕它构建的额外东西还不错,IMO)
    【解决方案2】:

    在尝试了 2 天的各种刷新/清理和使用 CORS 的东西后,在首先通过 Firebase 控制台删除该函数然后部署该函数后,终于发现它可以工作了。

    在我的情况下,部署的版本似乎以某种方式损坏。它从昨天开始,当时deploy 的函数被卡住了——它会挂起并且永远不会退出——即使 Firebase 状态页面说一切都很好。折腾了一整天,终于放下了,看看今天能不能用。我以为这是我的代码,但deploy 今天又开始工作了。

    【讨论】:

    • 这很奇怪,但我不得不删除并重新上传该功能。谢谢!
    【解决方案3】:

    这几天前发生在我身上。问题是当我运行firebase deploy时,我的 src 目录中的函数没有被编译。有打字稿错误阻止它编译。我相信你可以通过检查你的 lib 文件夹和 index.ts 来查看它是否编译。

    【讨论】:

      【解决方案4】:

      documentation 中所述,对于 HTTPS 可调用函数,您需要“返回可以 JSON 编码的数据”

      因此,如果您执行以下操作,它应该可以工作。

      exports.getSomeInfo = functions.https.onCall((data, context) => {
        return {result: 'some info'};
      });
      

      更新:删除了async

      【讨论】:

      • 这可能是问题的一部分。我现在认为这是由于我的应用程序被设置为 SPA,firebase.json 中的重定向将所有路由定向到index.html。当调用可调用函数时,它会到达 https 端点并进行重定向。
      • 我不确定客户端 SDK 在调用 Callable 函数时调用的域与您的项目托管域相同。关于您需要调用 HTTPS 云函数的 URL(即us-central1-<project-id>.cloudfunctions.net/.....),我想说它们是不同的,因此您的 SPA 设置不会影响可调用函数。
      • 我确认,Javascript SDK 使用具有以下结构的 URL 来调用可调用云函数:us-central1-<project-id>.cloudfunctions.net/…>
      • 您能否确认发回非 JSON 格式的数据是否会导致 Response for preflight is invalid (redirect) 错误?
      • 谢谢@RenaudTarnec,我的症状显然和布雷特完全一样。通过挖掘更多,我找到了一个解决方案,并在 github 上进行了描述,因为我觉得有一些东西可以添加到某个地方的文档中(firebase doc?或 angularfire2 doc?):(github.com/angular/angularfire2/issues/2077)。它可能会帮助一些开发人员。
      猜你喜欢
      • 1970-01-01
      • 2019-05-25
      • 2016-09-25
      • 2018-05-02
      • 2018-02-21
      • 2016-10-20
      • 2017-04-25
      • 2016-06-20
      • 2018-06-10
      相关资源
      最近更新 更多