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

Я работаю над проектом, в котором у нас есть уже существующие облачные функции, используемые с Firebase.Мы добавляем небольшой React SPA с использованием облачного хостинга Firebase, и этот SPA будет взаимодействовать с некоторыми из существующих функций публичного облака.

То, как мы работали до сих пор, у нас есть проект разработчика ипроизводственный проект в Firebase.Для облачных функций это работает нормально, у нас есть настройка среды, настроенная с firebase functions:config:set для различий между серверами prod и dev.

Проблема заключается в том, что размещенный SPA связывается с облачными функциями.Я видел много вопросов о том, как получить доступ к конфигурации среды в размещенном коде, например: Как ссылаться на переменные конфигурации функций Firebase из приложения, размещенного в Firebase? , где ответ кажетсяиметь функции firebase, которые возвращают значения переменных окружения, но для меня это просто перемещает проблему дальше на шаг.Я полностью понимаю, что наличие переменных среды, доступных для этого кода, было бы большой проблемой безопасности, поскольку SPA запускается в браузере.

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

например, если в моих облачных функциях у меня есть

const functions = require('firebase-functions');
const express = require('express');
const test = express();
test.on('/hello/:target', (req, res) => {
  res.send(`Hello ${req.params.target}`);
})
exports.test = functions.https.onRequest(test);

, то после развертывания эта облачная функция доступна как на https://us -central1-DEV-PROJECT-NAME.cloudfunctions.net/test/hello/world и https://us -central1-PROD-PROJECT-NAME.cloudfunctions.net / test / hello / world .Как лучше всего получить соответствующий корневой URL (https://us -central1-DEV-PROJECT-NAME.cloudfunctions.net или https://us -central1-PROD-PROJECT-NAME.cloudfunctions.net) для проекта, в котором развернут SPA, например,

.Есть ли какой-нибудь глобальный доступ к JS-коду внешнего интерфейса, где я мог бы сделать что-то вроде:

const url = `${__FIREBASE_GLOBALS__.cloudFunctions.baseUrl}/test/hello/${input}`;

И правильно ли определить URL в зависимости от того, в каком проекте размещено размещенное приложение?

1 Ответ

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

Я предполагаю, что вы не используете Firebase в СПА как-либо иначе, кроме как для вызова облачных функций (поскольку вы не сказали иначе).

Прочитайте Firebaseвеб-документация по настройке Firebase Hosting , особенно раздел Импорт SDK и неявная инициализация .Когда вы размещаете сайт с помощью Firebase Hosting, есть несколько специальных URL, которые предоставляют вам конфигурации для этого проекта.Есть несколько специальных скриптов, которые дают вам доступ к продуктам Firebase.В частности, обратите внимание, что относительный путь URI /__/firebase/init.js даст JavaScript, который инициализирует Firebase JavaScript SDK с настройками по умолчанию для вашего проекта.Получите доступ к этому в браузере, указывающем на ваше веб-приложение.Возможно, вас заинтересует свойство projectId в конфигурации.

Если вы хотите получить это значение, вы можете использовать Firebase SDK, который будет инициализирован сценарием, включенным из первогоссылка выше.Как минимум, вы можете добавить:

<script src="/__/firebase/5.8.2/firebase-app.js"></script>
<script src="/__/firebase/init.js"></script>

Затем ( см. Документы API ):

firebase.app().options.projectId

, чтобы получить идентификатор проекта, в котором находится Firebase Hostingобслуживающий контент.Вы можете использовать это для создания URL-адреса ваших функций.

Для вас также может быть удобно перенести свои функции HTTP на вызываемые функции и вызывать их с веб-сайта с помощью Firebase SDKпризвать их.Или нет.

...