Как я могу получить из облачной функции из развернутого приложения Firebase - PullRequest
0 голосов
/ 27 февраля 2019

В настоящее время у меня есть приложение Firebase, которое работает локально, когда я использую localhost: 5001 для вызова функций;однако, когда я пытаюсь использовать облачные функции при прямой маршрутизации, я получаю сообщение об ОШИБКЕ: ЗАПРЕЩЕНО, а когда я пытаюсь напрямую извлечь из развернутого приложения Firebase, я получаю ошибку CORS.

Внешний интерфейс вызывает службу, которая извлекает данные из бэкэнда.

 const requestOptions = {
        method: 'GET',
        mode: 'cors',
        headers: new Headers({ 'Content-Type': 'application/json' })
    };
 return fetch("https://us-central1-polling-269dc.cloudfunctions.net/api/polls/get", requestOptions).then(handleResponse);

Я также пытался просто не использовать режим и заголовки, но это не такРабота.Выборка вызывается правильно, но на странице загрузки https://polling -269dc.firebaseapp.com / # / я получаю это сообщение об ошибке:

Доступ к выборке в 'https://us -central1-polling-269dc.cloudfunctions.net / api / polls / get 'from origin' https://polling -269dc.firebaseapp.com 'заблокирован политикой CORS: НетЗаголовок «Access-Control-Allow-Origin» присутствует в запрашиваемом ресурсе.Если непрозрачный ответ отвечает вашим потребностям, установите режим запроса 'no-cors', чтобы получить ресурс с отключенным CORS.

В моей папке функций в моем index.js это функция и обязательный импорт:

const functions = require('firebase-functions');
const express = require('express');
const app = express();
const fire = require("./fire.js");
var database = fire.database();
var auth = fire.auth();

app.get("api/polls/get/", (req, res) => {
  var ref = database.ref("polls/");
  var query = ref.orderByChild("question");
  var sum = [];
  query.once("value", (snap) => {
    snap.forEach( (childSnap)  => {
      sum.push(childSnap.val());
    });
    res.json(sum);
  });
});

Я также пытался

app.get("https://us-central1-polling-269dc.cloudfunctions.net/api/polls/get/", (req, res) => {

, который имеет аналогичные результаты.Я подозреваю, что звоню не по адресу или мне нужно что-то подготовить, но я не могу найти информацию об этом.

Вот мой firebase.json, что-то здесь не так?

{
  "database": {
    "rules": "database.rules.json"
  },
  "hosting": {
    "public": "client/build",
    "ignore": [
      "firebase.json",
      "**/.*",
      "**/node_modules/**"
    ],
    "rewrites": [ {
      "source": "**",
      "function": "app"
    } ]
  },
  "functions": {
    "predeploy": [
      "npm --prefix \"$RESOURCE_DIR\" run lint"
    ]
  }
}

Опять же, это работает, когда я использую localhost и использую firebase serve, но я пытаюсь выяснить это для Firebase Deployment онлайн.Заранее спасибо.

1 Ответ

0 голосов
/ 28 февраля 2019

Хорошо, так что я понял проблему;вам нужно добавить имя экспортируемого набора функций в вызове.Мой звонок должен был быть:

https://us-central1-polling-269dc.cloudfunctions.net/app/api/polls/get

вместо

https://us-central1-polling-269dc.cloudfunctions.net/api/polls/get 

Надеюсь, это поможет любому, у кого возникла подобная проблема!

...