es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Versionado de Nestjs

Estoy utilizando Nestjs v8.1.1 y estoy intentando configurar la versión de la API. Mi objetivo es agregar en una nueva versión de la API solo aquellos métodos al controlador que hayan cambiado sin duplicar otros métodos inalterados.
Ejemplo:

API v1 Controlador de Equipos

@Controller('teams')
export class TeamsController {

@Get()
findAll() {
return this.teamsService.findAll();
}

@Get(':id')
findOne(@Param('id') id: string) {
return this.teamsService.findOne(id);
}

}

En la API v2 se agrega un nuevo método findAllV2 al Controlador de Equipos

@Controller('teams')
export class TeamsController {

@Get()
findAll() {
return this.teamsService.findAll();
}

@Get(':id')
findOne(@Param('id') id: string) {
return this.teamsService.findOne(id);
}

@Version('2')
@Get()
findAllV2() {
return this.teamsServiceV2.findAll();
}

}

Hasta aquí todo bien. En main.ts he establecido v1 como la versión predeterminada:

 app.enableVersioning({
 type: VersioningType.URI,
 defaultVersion: '1'
 });

Resultados:

http://localhost:8080/api/v1/teams -> funciona correctamente

http://localhost:8080/api/v1/teams/1 -> funciona correctamente

http://localhost:8080/api/v2/teams -> funciona correctamente

http://localhost:8080/api/v2/teams/1 -> no funciona (URL no encontrada 404). Me gustaría obtener los mismos resultados que /api/v1/teams/1 aquí sin duplicar el método findOne() que no ha cambiado en v2.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para lograr esto, necesitas incluir el método del controlador de la versión original también en el controlador de la nueva versión. Esto se puede hacer utilizando el decorador @Version en combinación con el decorador del método original (en este caso @Get). Aquí tienes un ejemplo actualizado del controlador TeamsController para v2 con el método findOne incluido:

    @Controller('teams')
    export class TeamsController {
    
     @Get()    
     findAll() {
       return this.teamsService.findAll();
     }
    
     @Version('1')
     @Get(':id')
      findOne(@Param('id') id: string) {
       return this.teamsService.findOne(id);
     }
    
     @Version('2')
     @Get(':id')
      findOneV2(@Param('id') id: string) {
       return this.teamsService.findOne(id);
     }
    
     @Version('2')
     @Get()
     findAllV2() {
       return this.teamsServiceV2.findAll();
     }
    
    }
    

    Ten en cuenta que el método findOne se incluye en v2 con el decorador @Version('1'), indicando que es igual a la versión v1. El método findOneV2 es nuevo para v2 y utiliza el decorador @Get original, pero con el número de versión nuevo especificado. Ahora la URL `http://localhost:8080/api/v2/teams/1` debería funcionar como se esperaba.

Comments are closed.