Как настроить правила перезаписи внутри firebase-hosting для маршрутизации определенных запросов к облачным функциям?

У меня есть PWA, построенный с использованием полимера 2.0 и полимерного огня, и это мое веб-приложение. У меня есть экспресс-приложение, работающее как облачная функция (микросервис). Пример: exports.register=functions.https.onRequest(app);

Как добавить правила перезаписи, чтобы сопоставить, скажем, /fns/register и /fns/verify с указанным выше приложением register.

Я обновил свой firebase.json файл в проекте микросервиса облачной функции, но когда я запускаю firebase deploy --only functions:register, он говорит, что нет общей папки для развертывания конфигурации хостинга!

{
    "hosting": {
        "rewrites": [{
            "source": "/fns/**", "function": "register"
        }]
    }    
}

Сохранение правил перезаписи в исходном веб-приложении может быть одним из вариантов, но все же это не идеальный вариант ИМХО. Если мне пришлось сделать это в моем исходном веб-приложении, я тоже попробовал, но не смог. Ниже приводится мой обновленный firebase.json в моем исходном веб-приложении:

{
  "database": {
    "rules": "database.rules.json"
  },
  "hosting": {
    "public": "build/default/public",
    "rewrites": [
      {
        "source": "/fns/**",
        "function": "register"
      },
      {
        "source": "**",
        "destination": "/index.html"
      }
    ]
  }
}

person Phani    schedule 09.06.2017    source источник


Ответы (3)


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

Вы пытаетесь изменить только один параметр (перезаписать) службы хостинга, и это не так, как это работает. При развертывании firebase.json все остальные конфигурации перезаписываются. Итак, ошибка, которую вы получили, заключается в том, что Firebase не просматривает последний файл конфигурации и не проверяет, что отличается от обновления, он просто пытается перезаписать весь последний файл конфигурации и выдает ошибку, потому что «общедоступный» является обязательным параметром для хостинга.

Это объяснилось, теперь вы ожидаете, что Firebase перезапишет /fns/register только на /register, но этого не произойдет. Ваша функция получит "полный" URL /fns/register.

На мой взгляд, лучший способ - создать корневой маршрут:

var functions = require('firebase-functions');
var express = require('express');

var app = express();
var router = express.Router();

router.post('/register', registerFunction);
router.post('/verify', verifyFunction);

app.use('/fns', router);

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

И перезаписывает все функции на fns функцию:

{
  "database": {
    "rules": "database.rules.json"
  },
  "hosting": {
    "public": "build/default/public",
    "rewrites": [
      {
        "source": "/fns/**",
        "function": "fns"
      },
      {
        "source": "**",
        "destination": "/index.html"
      }
    ]
  }
}

Теперь вы можете использовать https://<your-project-id>.firebaseapp.com/fns/register для доступа к функции регистрации и https://<your-project-id>.firebaseapp.com/fns/verify для доступа к функции проверки.

person Marcos V.    schedule 10.06.2017
comment
Спасибо @Marcos V за ответ. Но постоянное предложение Google IO 2017 - перейти на микросервисы. Следовательно, наличие всего одного проекта - не лучшее решение, которое я ищу. Я хочу использовать стиль микросервисов из-за их гибкости, масштабируемости и локализации ошибок. Следовательно, я не мог принять ваш ответ. - person Phani; 06.08.2017
comment
@Phani В заголовке вашего вопроса вообще нет упоминания о требованиях к отдельным проектам. Может быть, вы могли бы принять этот ответ (который отвечает на ваш главный вопрос) и открыть еще один вопрос о том, как иметь возможность поддерживать правила и функции перезаписи в отдельных проектах? - person Motin; 23.10.2017
comment
Я не могу принять это как решение @Motin, потому что поддерживать весь хостинг, функции и базу данных в одном проекте не идеально в мире микросервисов. Я бы предпочел согласиться с тем, что файл хостинга может находиться только в одном основном проекте (хотя и не идеальном). Но функции могут быть в любом количестве других проектов, а база данных может быть вообще в другом проекте. Это подход микросервиса, и я уже слежу за ним. - person Phani; 23.10.2017

На этот вопрос уже дан ответ здесь Хостинг Firebase с переписью динамических облачных функций

Я согласен с вами, что лучше всего сохранить SPA в одном проекте, а микросервис - в другом, но @Marcos V правильно использует корневую функцию

person martosoler    schedule 12.10.2017

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

При текущей настройке с firebase-hosting у вас должен быть файл конфигурации хоста только в одном проекте. Кроме того, хостинг должен быть в одном проекте, потому что все HTML, JS, CSS, связанные с вашим сайтом, будут иметь взаимозависимости и, следовательно, неразделимы (по крайней мере, на данный момент).

В то время как облачные функции лучше рассматривать как микросервисы, служащие определенной цели, и, следовательно, при необходимости они должны быть в отдельном проекте / микросервисе. Который можно легко развернуть с firebase deploy --only functions:YOUR_FN_NAME

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

Теперь поддержка правил базы данных в том же хостинг-приложении или в отдельном проекте оставлена ​​на усмотрение дизайнеров, которые могут решить, исходя из своего сценария использования.

person Phani    schedule 23.10.2017
comment
Думаю, вы неправильно поняли разницу между сервисами и проектами. Нет необходимости разбивать микросервисы на отдельные проекты, чем писать каждый из них на другом ноутбуке. Дело не в разлуке ради этого. - person Rob Hogan; 13.01.2021
comment
@RobHogan Я не защищаю разделение ради этого! Когда дело доходит до микросервисов, по крайней мере, наша практика заключается в том, чтобы дифференцировать их в зависимости от бизнес-функции, к которой они обращаются, а не только от сущности, с которой они имеют дело. Благодаря этому мы получаем разделение, необходимое для локализации изменений и потребностей тестирования при обновлении соответствующей бизнес-функции. Это хорошо помогает нашим командам решать множество проблемных вопросов, и наши усилия по тестированию резко сократились! Когда вся внутренняя логика в одном монолитном сервисе может вас укусить! - person Phani; 15.01.2021
comment
Отдельные проекты GCP тут ни при чем. GCP может размещать любое количество микросервисов в одном проекте, обычно вам нужно разделить проекты только по причинам выставления счетов или для простоты управления доступом. Но если вы нашли систему, которая работает для вас, достаточно честно и удачи с ней. - person Rob Hogan; 16.01.2021