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.
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 controladorTeamsController
para v2 con el métodofindOne
incluido: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étodofindOneV2
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.