Firebase 云功能 - onCall 不起作用

Posted

技术标签:

【中文标题】Firebase 云功能 - onCall 不起作用【英文标题】:Firebase Cloud Functions - onCall not working 【发布时间】:2018-10-16 04:11:15 【问题描述】:

我正在测试 FB 文档 (https://firebase.google.com/docs/functions/callable) 中描述的一个非常简单的实现,但它不起作用。

这是我部署到云端的 Firebase 函数

exports.getRecSkills = functions.https.onCall((data, context) => 
  return text: data.text;
);

...和我的客户调用(在初始化 FB 之后):

var getRecSkills = firebase.functions().httpsCallable('getRecSkills');

getRecSkills(text: '123').then(function(result) 
  console.log(result);
).catch(function(error) 
  console.log(error.code);
  console.log(error.message);
);

我遇到了一个与 CORS 标头相关的问题,但在文档中,它没有提到对 CORS 的需求……我错过了什么吗?

一些注意事项:

我已经能够执行其他 Firebase 功能(即 HTTPS、 数据库),所以我不认为是我错误地设置了 Firebase。 已更新到最新的 Firebase,所以也不要认为这是个问题。 给我一个“内部”错误,除了“出现严重错误”之外,API 文档没有帮助。 我似乎无法使该功能正常工作(它一直给我 400 错误)通过 shell 进行本地测试时,即使我知道了 与任何其他数据库和 https 函数一起使用

为此苦苦挣扎了很长一段时间...请帮助!

【问题讨论】:

您使用的是什么版本的客户端和节点 SDK? 我正在使用最新的 - FB 客户端 (v4.13.1) 和 FIrebase 管理员 (v5.12.0) 你在服务器上使用的是什么版本的 firebase-functions? 我正在使用 v1.0.2(最新)将我的功能部署到 Firebase,这就是我假设您要问的? 我看到你忘记用 projectId 初始化你的配置了。你的 URL 上有“未定义” 【参考方案1】:

要消除您的CORS 错误,请确保您的firebase.json 具有以下headers

"hosting": [
    
      "headers": [
        
          "source": "**",
          "headers": [
            
              "key": "Access-Control-Allow-Origin",
              "value": "*"
            
          ]
        
      ]
   
]

如果您在本地设备上运行 Firebase Emulator,请确保在初始化 Firebase 函数后具有以下内容,否则您的本地设备仍将调用远程 Firebase 函数,而您将再次遇到CORS 错误:

if (window.location.hostname === "localhost") 
    console.log("localhost detected!");
    firebase.functions().useFunctionsEmulator('http://localhost:5001');
;

【讨论】:

【参考方案2】:

我最近遇到了同样的问题,但在我的配置对象中包含我的“projectId”后解决了它。下面是 javascript 的 Firebase 配置对象的代码 sn-p。确保所有字段都已填写在您的配置对象中,它应该可以解决您未定义的问题。

     var config = 
     apiKey: "<API_KEY>",
     authDomain: "<PROJECT_ID>.firebaseapp.com",
     databaseURL: "https://<DATABASE_NAME>.firebaseio.com",
     projectId: "<PROJECT_ID>",
     storageBucket: "<BUCKET>.appspot.com",
     messagingSenderId: "<SENDER_ID>",
     ;

【讨论】:

【参考方案3】:

如果您有CORS 问题并且您使用express 来公开您必须允许cors 的API 函数:

import * as cors from 'cors';
import * as express from 'express';

const corsHandler = cors(origin: true);

const app = express();
app.use(corsHandler);

app.post('/createUser', async (request, response) => 
  await createUser(request, response);
);

exports.api = functions.https.onRequest(app);

【讨论】:

以上是关于Firebase 云功能 - onCall 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Firebase https onCall 功能被 cors 阻止

Firebase + Flutter - 云函数 onCall 导致 Android 应用出现“未经身份验证”错误

错误:响应不是具有 onCall 的 firebase 函数上的有效 JSON 对象

Firebase Http Oncall 函数

有啥方法可以使用角度组件中的 onCall Firebase 函数?

Firebase可调用函数+ CORS