Estoy trabajando con NestJS y necesito saber cuando un cliente ha forzado la desconexión o la ha cancelado . (ya sea por error o porque quisieron).
Por ejemplo, en Express es tan fácil como:
const express = require('express') const app = express() const port = 3000 app.get('/', (expressRequest, expressResponse) => { // Detecting close event expressRequest.on('close', function() { console.log('Client connection closed....!'); }); // Detecting end event expressRequest.on('end', function() { console.log('Client connection end....!'); }); expressResponse.send('Hello World!') }) app.listen(port, () => { console.log(`Example app listening at http://localhost:${port}`) })La pregunta es: trabajar con NestJS, ¿cuál es la forma correcta de hacerlo?
Nestjs tiene muchos componentes diferentes que se ejecutan en diferentes momentos durante el ciclo de vida de una solicitud.
El orden en que se ejecutan estos componentes sería el siguiente
Solicitud de NestJs Ciclo de vida
La respuesta a tu pregunta: creo que se debe detectar en los siguientes puntos
Lo primero que intentaría es usar el decorador de parámetros @Req() . Suponiendo que está utilizando el adaptador Express predeterminado de Nest, entonces el objeto de solicitud recibido es el objeto de req Express.
Lo siguiente debería funcionar para usted. El resto de esta publicación es solo limpiarlo y hacerlo más "Nido".
import { Controller, Get, Req } from '@nestjs/common'; import { Request } from 'express'; @Controller() export class AppController{ @Get() test(@Req() req: Request): string { req.on('close', () => console.log('Doing something with closed connection')) return "Hello, world!" } }Si planea reutilizar esta lógica en algunos métodos de controlador, también consideraría crear un decorador personalizado para él:
import { createParamDecorator, ExecutionContext } from '@nestjs/common'; import { Observable } from 'rxjs'; import { Request } from 'express'; export const OnConnectionClosed = createParamDecorator( (data: unknown, ctx: ExecutionContext) => new Observable((observer) => { const request = ctx.switchToHttp().getRequest<Request>(); request.on('close', () => observer.complete()); }), );Y luego usarlo de la siguiente manera:
@Controller() export class AppController{ @Get() test(@OnConnectionClosed() onClosed: Observable<void>): string { onClosed.subscribe({ complete: () => console.log('Connection closed'), }); return 'Hello, world!'; } }Y con eso, ha creado su propia forma "Nest" de escuchar eventos cercanos en la solicitud entrante.