Búsqueda de sitios web

typescript - ¿Por qué al usar el paquete "camelcase-keys" se produce un error de Firebase en "initializeApp()"?


Estoy tratando de crear algunas funciones en Firebase Cloud, y también usar el paquete npm camelcase-keys para transformar las claves de una respuesta de API.

Pero cada vez que uso ese paquete importado, obtengo este error:

Error: No se pudo cargar la definición de la función desde la fuente: No se pudo generar el manifiesto desde la fuente de la función: Error: La aplicación predeterminada de Firebase ya existe. Esto significa que llamaste a initializeApp() más de una vez sin proporcionar un nombre de aplicación como segundo argumento. En la mayoría de los casos, solo necesitas llamar a initializeApp() una vez. Pero si deseas inicializar múltiples aplicaciones, pasa un segundo argumento a initializeApp() para dar a cada aplicación un nombre único.

Este error me resulta extraño porque estoy siguiendo el consejo aquí y solo llamando a admin.initializeApp() una vez en el punto de entrada de mi función (index.ts).

Aquí está cómo se ve la estructura del archivo y una copia del código que estoy utilizando.

En lugar de incluir todo el código, solo he incluido las partes más importantes (importaciones, exportaciones y admin.initializeApp). Házmelo saber si sería útil pegar más código aquí:

functions/
├─ src/
│  ├─ index.ts
│  ├─ dataForSeo.ts

index.ts

import 'source-map-support/register';
import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';
admin.initializeApp();

export const sydneyFunctions = functions.region('australia-southeast1');
export const db = admin.firestore();

export {
  dataForSeoSerpGoogleOrganicDailyEnqueue,
  dataForSeoSerpGoogleOrganicTask,
  dataForSeoSerpGoogleOrganicPostbackUrl,
  dataForSeoOnPageStartCrawl,
  dataForSeoOnPageEnqueuePingbackUrl,
  dataForSeoOnPageGetResultTask,
} from './dataForSeo';

dataForSeo.ts

import camelcaseKeys from 'camelcase-keys';
import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';
import axios from 'axios';
import { getFunctions } from 'firebase-admin/functions';
import { DataForSeoGoogleOrganicPostTask, Serp, SerpItem } from './types';
import { getSecretVersion } from './googleSecretManager';
import { db, sydneyFunctions } from './index';

// Example usage
const test = camelcaseKeys(
  { 'foo-bar': true, nested: { unicorn_rainbow: true } },
  { deep: true }
);
functions.logger.info(test);

...
// Other functions below here

ACTUALIZACIÓN:

En lugar de usar el paquete camelcase-keys, intenté crear una función recursiva usando lodash que hace lo mismo.

Esto funciona sin error:

import { camelCase, isPlainObject } from 'lodash';

const camelizeKeys = <
  T extends Record<string, unknown> | Record<string, unknown>[]
>(
  obj: T
): T => {
  if (Array.isArray(obj)) {
    return <T>obj.map((v) => camelizeKeys(v));
  } else if (isPlainObject(obj)) {
    return <T>Object.keys(obj).reduce(
      (result, key) => ({
        ...result,
        [camelCase(key)]: camelizeKeys(<T>obj[key]),
      }),
      {}
    );
  }
  return obj;
};

Aunque esta función personalizada es una solución alternativa, todavía me gustaría hacer que el paquete camelcase-keys funcione.

Respuesta #1

Tuve exactamente el mismo problema, estaba siguiendo el tutorial de Flutter Codelabs para implementar la verificación de compras IAP (usan la biblioteca in_app_purchase de Flutter) en Firebase usando Cloud Functions.

Lo hice funcionar degradando la versión utilizada para camelcase-keys.

En tu archivo package.json establece camelcase-keys en la versión 6.2.2.

"camelcase-keys": "^6.2.2",

ejecuta npm install y luego deberías poder desplegar en Firebase nuevamente.

Respuesta #2

Ese es realmente un caso extraño. No puedo decir por qué está ocurriendo, pero para evitar reiniciar la aplicación prueba esto:

if (!admin.apps.length) {
  admin.initializeApp();
}

Artículos relacionados