Búsqueda de sitios web

javascript - Problemas al cargar dinámicamente JSON en Next.js a través de un paquete NPM


Tengo un proyecto de TypeScript que carga dinámicamente un archivo de configuración json basado en el valor de un enum pasado como parámetro a mi función getInstance en mi archivo PlatformConfigurationFactory.

  public static async getInstance(
    platform: Platform
  ): Promise<PlatformConfiguration> {
    const jsonData = await this.configurationRepository.getConfig(platform);
    if (!jsonData) {
      throw new Error("Configuration data not found");
    }

    this.jsonValidator.loadSchema();
    if (!this.jsonValidator.isValid(jsonData)) {
      throw new Error("Invalid JSON data according to schema");
    }

    return this.fromJson(jsonData);
  }

El archivo JsonConfigurationRepository se utiliza para leer el archivo y devolver su contenido en Json.

import { IConfigurationRepository } from "../../application/interfaces/IJsonConfigurationRepository";
import { Platform } from "../../core/domain/Platform";
import fs from "fs/promises";
import path from "path";

export class JsonConfigurationRepository implements IConfigurationRepository {
  async getConfig(platform: Platform): Promise<any> {
    const fileName = `${platform}-config.json`;
    const filePath = path.resolve(__dirname, "../../data", fileName);

    try {
      const fileContent = await fs.readFile(filePath, "utf-8");
      return JSON.parse(fileContent);
    } catch (error) {
      console.error(`Error loading configuration for ${platform}:`, error);
      return null;
    }
  }
}

Los archivos se almacenan en el directorio ./src/data y cuando TypeScript construye los archivos en la carpeta ./dist, los archivos json están presentes gracias a mi configuración a continuación.

{
  "compilerOptions": {
    "target": "ESNext",                          
    "experimentalDecorators": true,              
    "emitDecoratorMetadata": true,               
    "module": "ESNext",                          
    "rootDir": "./src",                          
    "moduleResolution": "Node",                  
    "baseUrl": "./",                             
    "paths": {                                   
      "@mylib/*": ["src/*"]
    },                                      
    "resolveJsonModule": true,                   
    "declaration": true,                         
    "declarationMap": true,                      
    "outDir": "./dist",                          
    "skipLibCheck": true                         
  },
  "include": [
    "src/**/*",
    "data/**/*.json",
  ],
  "exclude": [
    "node_modules",
    "**/*.spec.ts",
    "**/*.test.ts"
  ]
}

Las pruebas están bien, cuando llamo a mi fábrica devuelve la configuración de una plataforma que paso como parámetro :

    const config = await PlatformConfigurationFactory.getInstance(
      Platform.Facebook
    );

Este proyecto luego se almacena en el Registro de Paquetes de Gitlab como un paquete NPM, que instalo en un proyecto Next.js 14 mediante npm i @mylib/platform-configurations.

Pero cuando tengo un error al llamar el mismo código en Next.js :

    const config = await PlatformConfigurationFactory.getInstance(
      Platform.Facebook
    );

Error :

Error al cargar la configuración de facebook: [Error: ENOENT: no existe el archivo o directorio, abrir '/Users/me/workspace/nextjs/.next/server/json/facebook-config.json'] { errno: -2, código: 'ENOENT', syscall: 'open', path: '/Users/me/workspace/nextjs/.next/server/json/facebook-config.json' } ⨯ Error: Datos de configuración no encontrados en Generator.next() digest: "2762426514" ⨯ Error: Datos de configuración no encontrados en Generator.next() digest: "2762426514"

El código intenta cargar el archivo en la ruta incorrecta en lugar de cargar el archivo en dist/data en el paquete instalado. ¿Cómo puedo solucionar el problema, por favor?

Respuesta #1

No sé si esto se ajusta a tu problema, pero podrías hacer algo así:

 const isDevelopment = process.env.NODE_ENV === 'development';
 const filePath = isDevelopment ?
      path.resolve(__dirname, "../../data", fileName) :
      require.resolve(`@mylib/platform-configurations/data/${fileName}`);

Básicamente comprobando si estás desarrollando, así que usa lo que haces ahora, o resuelve la ruta correcta