Para ser breve:
Tengo un servicio, llamémoslo CatsService...
import { Injectable } from '@nestjs/common'; @Injectable() export class CatsService { GetCat(id: number){ return id + 12345; } }Posteriormente, un módulo desea usar este CatsService para inyectarlo en un constructor. También resuelve dinámicamente este CatsService
import { Module } from '@nestjs/common'; import { CatsController } from './cats.controller'; import { CatsService } from './cats.service'; import * as ProductionCatsService from "./production" import * as DevelopmentCatsService from "./development" const catsServiceProvider = { provide: CatsService, useValue: process.env.NODE_ENV === "development" ? DevelopmentCatsService : ProductionCatsService } @Module({ controllers: [CatsController], providers: [catsServiceProvider], exports:[CatsService] }) export class CatsModule {} Ambas implementaciones de estos servicios están estrictamente vacías . Esto significa que la ruta /cats/:id devuelve:
{"statusCode":500,"message":"Internal server error"}
He tenido la idea desde que comencé a escribir esto para hacer que todo implemente una interfaz ICatsService.
Después de mucho juguetear, he creado una especie de solución:
Tengo un archivo "service_interface", que tiene una clase abstracta llamada ICatsInterface con un método abstracto (GetCat)
He hecho que cada una de estas implementaciones implemente este service_interface.
He hecho que el controlador tome ICatsService en lugar de CatsService
Mi problema es que ahora, la cosa se compila, pero aparece el siguiente error:
TypeError: this.catsService.GetCat is not a function at CatsController.get (/home/a/learning-nest/src/cats/cats.controller.ts:12:33) at /home/a/learning-nest/node_modules/@nestjs/core/router/router-execution-context.js:38:29 at processTicksAndRejections (node:internal/process/task_queues:96:5) at /home/a/learning-nest/node_modules/@nestjs/core/router/router-execution-context.js:46:28 at /home/a/learning-nest/node_modules/@nestjs/core/router/router-proxy.js:9:17 Simplemente ya no sé qué hacer. Aunque lo hice compilar, no puedo forzarlo a implementar la interfaz/clase abstracta que quiero. Me he asegurado de que tanto DevelopmentCatsService como ProductionCatsService tengan la implementación de GetCat. Ambos están marcados con @Injectable . La verdad es que no sé a dónde ir desde aquí.
¿Debo abandonar mi sueño de tener un mensaje de error en tiempo de compilación para cuando alguien no implemente los métodos que quiero implementar en mi servicio?
He resuelto mi propio problema. fue muy simple
import { Module } from '@nestjs/common'; import { CatsController } from './cats.controller'; import { CatsService } from './cats.service'; import * as ProductionCatsService from "./production" import * as DevelopmentCatsService from "./development" const catsServiceProvider = { provide: CatsService, useValue: process.env.NODE_ENV === "development" ? DevelopmentCatsService : ProductionCatsService } @Module({ controllers: [CatsController], providers: [catsServiceProvider], exports:[CatsService] }) export class CatsModule {}En el fragmento anterior, estoy importando "* como ProductionCatsService". ¡Esto hizo que ProductionCatsService fuera realmente un objeto que envolvía la implementación del servicio real que yo quería!
Perdón por la molestia, todos.