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
