tutorial pricing only example ejemplo deploy express firebase google-cloud-functions firebase-hosting

express - pricing - firebase hosting rewrite



Hosting de Firebase con funciones de la nube dinĂ¡mica reescribe (1)

Tengo una aplicación de funciones en la nube basada en express.js en firebase en una función llamada api . Para usar un dominio personalizado, intento usar las rescripciones de Hosting de Firebase para enrutar la URL específica a la función. Estoy siguiendo la documentación oficial sobre las funciones en la nube y el alojamiento de Firebase aquí, https://firebase.google.com/docs/hosting/functions , y he intentado muchas combinaciones, incluida la siguiente:

"rewrites": [ { "source": "/api/**", "function": "api" } ] "rewrites": [ { "source": "/api/:path1/:dat1/dat", "function": "api/:path1/:dat1/dat" } ] "rewrites": [ { "source": "/api/path1/dat1/dat", "function": "api" } ] "rewrites": [ { "source": "/api/*/*/*", "function": "api" } ]

Tristemente, no parece funcionar para ninguna combinación posible. Mi aplicación expresa tiene las siguientes rutas GET que planeo usar:

''/api/users/:userId/:userData'' ''/api/users/:userId/:userData/json'' ''/api/users/:userId/''

y otros similares a estos. the: userId y: userData son los parámetros en mi solicitud, ya que funciona con express.js

Las funciones requeridas funcionan como se espera en

https://my-firebase-app.cloudfunctions.net

pero no funcionan con

https://my-app.firebaseapp.com

Por favor, dime cómo se supone que funcionan y qué estoy haciendo mal.

EDITAR: Aquí hay una muestra de cómo se ve la exportación de mis funciones en la nube

const functions = require(''firebase-functions''); const express = require(''express''); const app = express(); app.get(''/users/:userId/:userData/json'', (req, res) => { // Do App stuff here } // A couple more app.get in the same format exports.api = functions.https.onRequest(app);

EDIT 2: Después de la sugerencia de @ DougStevenson, probé la siguiente configuración

Intenté lo siguiente en mi firebase.json,

{ "hosting": { "rewrites": [ { "source": "/api", "function": "api" } ], "public": "public" } }

Pero tengo el mismo problema, la función nunca se llama. Leí acerca de cómo las reescrituras son opciones de último recurso y si hay archivos presentes en el alojamiento, no irá a la función especificada. (Intenté buscar la publicación SO donde se menciona esto pero no puedo encontrarlo). Eliminé los archivos 404.html e index.html del directorio público de alojamiento, ya que no los necesito de todos modos. Pero el problema aún permanecía.

EDIT 2: Bien, entonces después de muchas pruebas y errores, solo tuve que codificar las rutas en el siguiente formato:

rewrites : [ { "source": "/users/**/**/json", "function": "api" }, { "source": "/api/users/**/**/json", "function": "api" } ]

Después de esto, la aplicación express se configura de la siguiente manera:

app.get(''/users/:userId/:userData/json'', Foo)

Todavía preferiría que alguien pudiera sugerir una mejor manera de lograr esto en lugar de poner manualmente cada URI requerido en las reescrituras de alojamiento.


Lo que parece ser el problema principal es que esto:

{ "source": "/api", "function": "api" }

en realidad está reescribiendo en https://my-firebase-app.cloudfunctions.net/api/api lugar de https://my-firebase-app.cloudfunctions.net/api como es de esperar. Observe cómo se repite la api .

Mi solución a esto es crear una función main que aloje todas las demás funciones de nivel superior:

const functions = require(''firebase-functions''); const express = require(''express''); const app = express(); app.get(''/users/:userId/:userData/json'', (req, res) => { // Do App stuff here } // A couple more app.get in the same format // Create "main" function to host all other top-level functions const main = express(); main.use(''/api'', app); exports.main = functions.https.onRequest(main);

Ahora puede usar esta función main para delegar en todas las demás funciones sin romper su estructura de URL:

{ "source": "/api/**", // "**" ensures we include paths such as "/api/users/:userId" "function": "main" }

¡Y voilá! Ahora puede acceder a todas las llamadas a la función api a través de https://my-app.firebaseapp.com/api/users/:userId/:userData tal como lo esperaría.

Al llamar a este punto final, ahora vuelve a escribir en https://my-firebase-app.cloudfunctions.net/main/api que es técnicamente correcto. A continuación, puede agregar más funciones de nivel superior simplemente agregándolas a su función main si lo desea:

const hooks = express(); main.use(''/hooks/, hooks);