web-dev-qa-db-fra.com

Comment configurer les règles de réécriture dans l'hébergement Firebase pour acheminer certaines requêtes vers les fonctions cloud?

J'ai un PWA construit en utilisant polymer 2.0 et polymerfire et est mon application web. J'ai une application express agissant comme une fonction cloud (microservice). Exemple: exports.register=functions.https.onRequest(app);

Comment ajouter les règles de réécriture à la carte, dites /fns/register et /fns/verify à l'application ci-dessus register.

J'ai mis à jour mon firebase.json fichier dans le projet de microservice cloudfunction, mais lorsque j'exécute firebase deploy --only functions:register il indique qu'il n'y a pas de dossier public pour déployer la configuration d'hébergement!

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

Le maintien des règles de réécriture dans l'application Web d'origine pourrait être une option, mais n'est pas idéal à mon humble avis. Si je dois le faire dans mon application Web d'origine, j'ai également essayé, mais je n'ai pas pu le faire. Voici ma mise à jour firebase.json dans mon application Web d'origine:

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

Le maintien d'un seul projet pour toutes les ressources (hébergement, fonctions et base de données) est l'idéal, je pense que c'est la bonne façon de gérer les projets Firebase.

Vous essayez de modifier un seul paramètre (réécriture) du service d'hébergement, et ce n'est pas ainsi que cela fonctionne. Lorsque vous déployez firebase.json, toutes les autres configurations sont écrasées. Donc, l'erreur que vous avez obtenue est que Firebase ne regarde pas le dernier fichier de configuration et ne vérifie pas ce qui est différent à mettre à jour, il essaie simplement d'écraser tout le dernier fichier de configuration et d'obtenir une erreur car "public" est un paramètre requis pour l'hébergement.

Cela expliqué, vous vous attendez maintenant à ce que Firebase réécrit /fns/register pour juste /register, mais cela ne se produira pas. Votre fonction va recevoir l'url "complète" /fns/register.

La meilleure façon, je pense, est de créer une route racine:

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);

Et réécrit toutes les fonctions dans la fonction fns:

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

Vous pouvez maintenant utiliser https://<your-project-id>.firebaseapp.com/fns/register pour accéder à votre fonction d'enregistrement et https://<your-project-id>.firebaseapp.com/fns/verify pour accéder à votre fonction de vérification.

28
Marcos V.

Cette question est déjà répondue ici Hébergement Firebase avec des fonctions de cloud dynamique réécrit

Je suis d'accord avec vous qu'il est préférable de conserver le SPA dans un projet et le microservice dans un autre, mais @Marcos V a raison d'utiliser une fonction racine

0
martosoler