我已经部署了一个云功能,如下所示:
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配置它。因此,我也将其标题缩小了。
答案 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; }
肯定不容易找到,所以这里有一个额外的指针。