Soy bastante nuevo en este tipo de cosas, por lo que agradezco cualquier consejo, especialmente si hay una mejor manera de resolver esto que lo que estoy buscando.
Estoy tratando de admitir un punto de conexión anterior al redirigirlo a un punto de conexión nuevo, y ambos puntos de conexión deberían admitir parámetros de consulta. Cada punto final vive en un controlador separado.
Ejemplo: quiero que /old-namespace/getStuff?foo=bar redirija a /new-namespace/getStuff?foo=bar sin reconstruir manualmente una cadena de consulta como señalan los documentos de Nest, porque los parámetros pueden ser dinámicos.
Mirando los documentos de NestJS , hay un práctico decorador @Redirect que puede usar en un punto final como este, para redirigir fácilmente la solicitud a una URL diferente:
@Get('docs') @Redirect('https://docs.nestjs.com', 302) getDocs(@Query('version') version) { if (version && version === '5') { return { url: 'https://docs.nestjs.com/v5/' }; } } Sin embargo, al usar esto, request.query se borra en la redirección (bastante seguro de que este es el comportamiento esperado). ¿Alguien tiene una solución mínimamente invasiva para esto? Probé la creación de middleware/interceptores/decoradores personalizados para sortear esto con diversos grados de éxito, pero eso parece una mano dura y desearía que hubiera una manera de agregar un parámetro adicional en el decorador @Redirect como retainQuery = true o alguna cosa.
Terminé usando la respuesta principal aquí: ¿Cómo reescribir la ruta de URL en Nestjs?
La primera respuesta de Ambroise Rabier sobre las reescrituras de nginx me indicó que buscara una solución de middleware simple, ya que no quería inyectar un servicio en varios lugares, ya que habrá bastantes pequeños redireccionamientos de los espacios de nombres antiguos a los nuevos.
En un módulo común:
consumer .apply(RewriteApiEndpointMiddleware) .forRoutes('/')En un software intermedio:
import { Injectable, NestMiddleware } from '@nestjs/common'; @Injectable() export class RewriteApiEndpointMiddleware implements NestMiddleware { use(req: any, res: any, next: () => void) { // the linked answer replaced "api" but in my case I needed to send "app" requests somewhere else req.url = req.url.replace(/^\/app/, '/new-namespace'); next(); } }Lo que necesitas se llama reescribir en nginx.
No sé si funciona, pero tal vez usted puede hacer eso?
@Get('/old-namespace/getStuff') getStuff(@Query() query) { // Done ! getNewStuff(query); } @Get('/new-namespace/getStuff') getNewStuff(@Query() query) { }Si no, siempre puedes hacer algo como:
function handleGetNewStuff() { } @Get('/old-namespace/getStuff') getStuff(@Query() query) { handleGetNewStuff(query); } @Get('/new-namespace/getStuff') getNewStuff(@Query() query) { handleGetNewStuff(query); }Sin embargo, si su problema es cambiar el enlace en el lado del usuario (y no solo para el enrutamiento interno), puede intentar (tampoco probado):
@Get('/old-namespace/getStuff') getStuff(@Req() request, @Res() response) { const newURL = req.originalUrl.replace('old', 'new'); response.redirect(newURL); }Recuerde que NestJS usa expressJS a continuación.