如何在除us-central1之外的其他地区使用httpsCallable进行网络

时间:2019-08-18 19:32:14

标签: firebase google-cloud-functions

我已经部署了一个云功能,如下所示:

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

然后在我的Web客户端中,我定义一个函数来调用它,如下所示:

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错误:

  

从原点“ https://us-central1-my-project.cloudfunctions.net/publishVersion”到“ http://localhost:3000”的提取操作已被CORS策略阻止:对预检请求的响应未通过访问控制检查:预检请求不允许重定向

即使我的功能已部署到us-central1,它似乎仍在尝试与europe-west2通信。当我部署firebase-tools时,告诉我该网址应该是什么:

  

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

在哪里/如何控制事情以防止发生CORS错误,如何将httpsCallable定向到其他区域?

official documentation没有提及任何这些。

---编辑---

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

---编辑---

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

  

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

这似乎是一个很好的指针,但是我看不到如何为Web配置它。因此,我也将其标题缩小了。

2 个答案:

答案 0 :(得分:0)

通过检查源代码找到它。因此,这不在文档中,而且由于您可以使用各种不同的方法来获取函数实例的句柄,因此有点令人困惑,但这是这样的:

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

答案 1 :(得分:0)

documentation仅说明Thijs在源代码中发现的内容。撰写本文时摘录:

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

get category() {
  return this.categoryForm.get("subcategories") as FormArray;
}

肯定不容易找到,所以这里有一个额外的指针。