Firebase可调用函数:飞行前响应无效

Firebase可调用函数:飞行前响应无效,firebase,google-cloud-functions,Firebase,Google Cloud Functions,我已经创建了一个Firebase可调用函数,带有一个简单的文本返回,但在本地和部署的应用程序上调用该函数时收到一个错误 callable函数是一个简单的函数,现在可以返回一些文本: exports.getSomeInfo = functions.https.onCall(async (data, context) => { return 'some info'; }); 在我的应用程序中,我加载以下功能: const getSomeInfo = firebase.functions(

我已经创建了一个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 Service
在本地和部署的应用程序上调用函数时,会发生此错误

在Firebase控制台中查看日志不会显示任何日志或错误

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

使用Firebase@5.5.2.

还有什么可能导致此错误

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

因此,如果您执行以下操作,它应该会起作用

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

更新:删除了
async

这几天前发生在我身上。问题是,当我运行
firebase deploy
时,src目录中的函数没有被编译。存在typescript错误,使其无法编译。我相信,您可以通过检查lib文件夹和index.ts来查看它是否已编译

在尝试了2天的各种刷新/清理和CORS后,最终发现它在首先通过Firebase控制台删除该功能,然后部署该功能后工作正常


在我的例子中,似乎部署的版本以某种方式损坏了。它开始于昨天,当时函数的
deploy
被卡住了-它将挂起并且永远不会退出-尽管Firebase状态页面说一切都很好。它持续了一整天,我终于让它走了,看看它今天是否能起作用。我原以为这是我的代码,但是
deploy
今天又开始工作了

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

这可能是问题的一部分。我现在认为这是因为我的应用程序被设置为SPA,并在
firebase.json
中重定向到
index.html
。调用可调用函数时,它会命中https端点并进行重定向。我不确定客户端SDK在调用可调用函数时调用的域是否与项目宿主域相同。关于您需要调用HTTPS云功能(即)的URL,我想说它们是不同的,因此您的SPA设置不会影响可调用功能。我确认,Javascript SDK使用具有以下结构的URL来调用可调用的云函数:>您能否确认返回非JSON格式的数据是否会导致飞行前的
响应无效(重定向)
错误?谢谢@RenaudTarnec,我的症状显然与Brett完全相同。通过进一步挖掘,我找到了一个解决方案,并在github上进行了描述,因为我觉得在某个地方有一些东西可以添加到文档中(firebase文档?或angularfire2文档?)()。这可能会帮助一些开发人员。我在这一页,因为部署后,我的云功能无法工作。然而,在functions emulator中,一切正常,无需预先添加模块名。生产服务器与函数模拟器不同的原因是什么?@krummens-我能够成功地打开和关闭函数(大部分是关闭的)。我被https.onCall(以及相关的文档,以及这里和其他地方不清楚的半个答案)弄得不知所措,以至于我完全放弃了使用它们(包括最近的一次测试,就像你一样,我认为我在模拟中找到了它,但在生产中使用CORS却失败了)。现在,我一直依赖于使用express中间件的https.onRequest()函数和客户端上的一些自制调用方基础结构(到目前为止取得了成功)。这在网上的任何地方都没有得到很好的端到端描述如果你愿意,问一个问题并在这里给我看链接,我会发布我的解决方案。花了很多时间开发
onCall
,我希望有一个比为
onRequest
@krummens重写更简单的解决方案-祝你好运,如果你把它整理好的话,请使用lmk。我很乐意使用onCall(和bounty作为答案),它可以在模拟器和生产环境中进行完整的堆栈往返,并保持工作状态。我想我有onRequest(我围绕它构建的额外东西并不太糟糕,IMO)这很奇怪,但我不得不再次删除并上传该函数。非常感谢。