node.js - ¿Cuál es el tipo adecuado para un manejador de solicitudes de una Firebase HttpsFunction?
Necesito dividir mis funciones en varios archivos.
Este es mi index.ts
export const helloWorld = functions.https.onRequest((request, response) => {
functions.logger.info("Hello logs!", {structuredData: true});
response.send("Hello from Firebase!");
});
Necesito que sea algo así:
import helloWorldHandler from "./handlers/helloWorldHandler"
export const helloWorld = functions.https.onRequest(helloWorldHandler);
¿Entonces qué debería escribir en el manejador de solicitudes helloWorldHandler?
const helloWorldHandler : ??? = async (req,res) => {
const result = await someApi();
functions.logger.info("Hello logs!", {structuredData: true});
res.send("Hello from Firebase!");
};
export default helloWorldHandler;
Intenté:
import * as functions from "firebase-functions";
const helloWorldHandler : functions.HttpsFunction = async (req,res) => { ... };
Pero estoy recibiendo este error:
El tipo '(req: Request, res: Response) => Promise
' no es asignable al tipo 'HttpsFunction'. La propiedad '__trigger' falta en el tipo '(req: Request, res: Response) => Promise
' pero es requerida en el tipo 'TriggerAnnotated'.
El método onRequest(), el que debería tomar el manejador como un parámetro, no parece darle un nombre de tipo adecuado, más bien una firma de función. ¿Necesito crear un alias para eso?
Respuesta #1
El tipo functions.HttpsFunction es el tipo de retorno de functions.https.onRequest(), y no el argumento de esta. Una función de este tipo es exportada por tu código y define lo que necesita ser desplegado por la CLI de Firebase (la región, tamaño de memoria y demás se almacenan en la propiedad __trigger).
Como quieres el tipo del primer argumento de functions.https.onRequest(), en su lugar estás buscando el tipo:
type HttpsOnRequestHandler = (req: functions.https.Request, resp: functions.Response<any>) => void | Promise<void>
Pero en lugar de codificar esto de forma fija, puedes extraerlo de la biblioteca de Firebase Functions usando cualquiera de:
import * as functions from "firebase-functions";
type HttpsOnRequestHandler = Parameters<typeof functions.https.onRequest>[0];
o
import { https } from "firebase-functions";
type HttpsOnRequestHandler = Parameters<typeof https.onRequest>[0]
Nota: Si tu código no utiliza la biblioteca firebase-functions en sí misma, puedes indicarle a TypeScript que solo deseas sus tipos usando import type * as functions from "firebase-functions"; y import type { https } from "firebase-functions"; según corresponda; esto elimina la importación del JavaScript compilado ya que no es necesaria para ejecutar el código.
Respuesta #2
Logré ejecutar las nuevas Funciones de Firebase v2 en TypeScript con
// import from a specific subpackage
import {onRequest} from "firebase-functions/v2/https";
export default onRequest((request, response) => {
response.send("Hello from Firebase!");
});
