【问题标题】:How to use httpsCallable on a region other then us-central1 for web如何在 us-central1 以外的区域使用 httpsCallable for web
【发布时间】:2019-12-24 03:25:07
【问题描述】:

我部署了一个如下所示的云功能:

export const publishVersion = functions
  .region("europe-west2")
  .https.onCall(async (data, context) => {}

然后在我的网络客户端中,我定义一个函数来调用它:

import { functions } from "firebase";

const callPublishVersion = functions().httpsCallable("publishVersion");

export function publishVersion(
  guidelineId: string,
  guidelineReference: string
) {
  return callPublishVersion({
    id: guidelineId,
    reference: guidelineReference
  });
}

请注意,我包装该函数的唯一原因是在我的客户端中进行严格的输入,但这不是这个问题的重点。

问题是,如果我在本地服务器 (localhost) 上运行 Web 客户端并调用该函数,有两件事似乎出错了。我收到 CORS 错误:

CORS 策略已阻止从源“http://localhost:3000”获取“https://us-central1-my-project.cloudfunctions.net/publishVersion”的访问权限:对预检请求的响应未通过访问控制检查:预检请求不允许重定向。

而且看起来它正在尝试与us-central1 通信,即使我的功能已部署到europe-west2。当我部署 firebase-tools 时告诉我 url 应该是什么:

✔ functions[publishVersion(europe-west2)]: 创建操作成功。 函数网址(publishVersion):https://europe-west2-baymard-gemini-dev.cloudfunctions.net/publishVersion

我在哪里/如何控制以防止出现此 CORS 错误,以及如何将 httpsCallable 定向到不同的区域?

official documentation 没有提及这些。

--- 编辑---

我刚刚发现,如果我将该功能部署到 us-central1,它就可以正常工作。所以 CORS 部分不是问题(我将从标题中删除它),问题变成:如何配置 Web 客户端以调用正确的区域?

--- 编辑---

我在文档中注意到了这一点:

注意:要调用在默认 us-central1 以外的任何位置运行的函数,您必须在初始化时设置适当的值。例如,在 Android 上,您将使用 getInstance(FirebaseApp app, String region) 进行初始化。

这似乎是一个很好的指针,但我不知道如何为 web.xml 配置它。所以我也会在标题中缩小范围。

【问题讨论】:

    标签: firebase google-cloud-functions


    【解决方案1】:

    通过检查源代码找到它。所以这不在文档中,这有点令人困惑,因为你可以通过各种不同的方式来获取函数实例的句柄,但这是这样的:

    const app = firebase.app();
    const functions = app.functions("europe-west2");
    const callPublishVersion = functions.httpsCallable("publishVersion");
    

    【讨论】:

    【解决方案2】:

    documentation 只是解释了 Thijs 在源代码中发现的内容。在撰写本文时摘录:

    要在客户端设置区域,请在初始化时指定所需区域:

    var functions = firebase.app().functions('us-central1');
    

    肯定不好找,所以在这里多指点一下。

    【讨论】:

      【解决方案3】:

      这是一个不同的版本,使用Modular Web-Version 9

      import { initializeApp } from 'firebase/app';
      import { getFunctions, httpsCallable } from "firebase/functions";
      
      const app = initializeApp({
        // Auth stuff
      });
      // add the location string as you call getFunctions
      const functions = getFunctions(app, "europe-west3");
      const myFunction = httpsCallable(functions, "myFunction");
      

      【讨论】:

        猜你喜欢
        • 2019-11-01
        • 2023-02-18
        • 2019-01-17
        • 2021-04-10
        • 2022-09-15
        • 1970-01-01
        • 2021-12-13
        • 2020-10-27
        • 2023-01-03
        相关资源
        最近更新 更多