【问题标题】:Firebase Cloud Functions - onCall not workingFirebase 云功能 - onCall 不起作用
【发布时间】: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 上有“未定义”

标签: javascript firebase cors google-cloud-functions


【解决方案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);
      

      【讨论】:

        猜你喜欢
        • 2019-06-20
        • 2020-11-29
        • 2021-09-15
        • 2021-08-15
        • 2020-09-08
        • 2020-09-13
        • 2019-11-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多