我正在使用NestJS,我需要知道客戶端何時強制斷開連接或取消它。(要么是錯誤的,要么是因為他們想要)。
例如,在 Express 中很簡單:
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}`)
})
問題是:使用 NestJS,正確的方法是什么?
uj5u.com熱心網友回復:
Nestjs 有許多不同的組件,它們在請求的生命周期中的不同時間執行。
這些組件的執行順序如下
NestJs 請求生命周期
- 傳入請求
- 全域系結的中間件
- 模塊系結中間件
- 全球衛士
- 控制器防護
- 路線守衛
- 全域攔截器(預控制器)
- 控制器攔截器(預控制器)
- 路由攔截器(預控制器)
- 全球管道
- 控制器管道
- 布管
- 路由引數管道
- 控制器(方法處理程式)
- 服務(如果存在)
- 路由攔截器(請求后)
- 控制器攔截器(請求后)
- 全域攔截器(請求后)
- 例外過濾器(路由,然后是控制器,然后是全域)
- 服務器回應**
你的問題的答案:我認為應該從以下幾點來檢測
- 全域攔截器(請求后)
- 控制器攔截器(請求后)
uj5u.com熱心網友回復:
我要嘗試的第一件事是使用@Req() 引數裝飾器。假設您使用的是 Nests 默認 Express 配接器,那么收到的請求物件就是 Expressreq物件。
以下內容應該適合您。這篇文章的其余部分只是清理它并使其更“巢”。
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!"
}
}
如果你打算在一些控制器方法中重用這個邏輯,那么我也會考慮為它創建一個自定義裝飾器:
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());
}),
);
然后像下面這樣使用它:
@Controller()
export class AppController{
@Get()
test(@OnConnectionClosed() onClosed: Observable<void>): string {
onClosed.subscribe({
complete: () => console.log('Connection closed'),
});
return 'Hello, world!';
}
}
這樣,您就創建了自己的“Nest”方式來偵聽傳入請求的關閉事件。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/411366.html
標籤:
