目标:以便在响应被完全处理并成功发送出去之后运行一些代码。
根据这些文档,我尝试了以下方法:
@Injectable()
export class LoggingInterceptor implements NestInterceptor {
intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
console.log(`${Date.now()} Before...`);
const now = Date.now();
return next
.handle()
.pipe(tap(() => console.log(`${Date.now()} After... ${Date.now() - now}ms`)));
}
}
app
的配置如下:
const app = await NestFactory.create(AppModule, {
bufferLogs: true,
rawBody: true,
});
app.useGlobalInterceptors(new LoggingInterceptor());
app.useLogger(app.get(Logger));
但是问题是"After..."
在"request completed"
HTTP日志之前被记录(nestjs-pino
与pino-http
),我假设这意味着代码在响应发出之前被执行(对吗?)
其他尝试
使用onFinished:
app.use((req: IncomingMessage, res: OutgoingMessage, next: any) => {
next();
onFinished(res, function (err, res) {
console.log(`${Date.now()} onFinished with req ${req.url}`);
console.log(`${Date.now()} onFinished with error ${err}`);
});
});
但是结果是一样的。而且,除了一些错误处理的问题,它被应用到每个HTTP请求,甚至是传出的请求(这不是我想要的)。很可能这不是它应该被使用的方式。
我还发现了这个answer:
@Injectable()
export class LoggingInterceptor implements NestInterceptor {
intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
const response = context.switchToHttp().getResponse();
response.on("close", () =>
console.log(`${Date.now()} After...`));
return next.handle();
}
}
这似乎是可行的,即它确实在request completed
之后记录After...
。然而,作者发表了评论:* 也许不是一个好的选择 *.我是NestJS的新手,不知道为什么它不是一个好的选择.
在响应发出后执行一些自定义代码的正确方法是什么?谢谢。
1条答案
按热度按时间ma8fv8wu1#
因此异常不会破坏您应用程序