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