NodeJS 在NestJS中完成响应后执行代码

huwehgph  于 2023-02-21  发布在  Node.js
关注(0)|答案(1)|浏览(158)

目标:以便在响应被完全处理并成功发送出去之后运行一些代码。

根据这些文档,我尝试了以下方法:

@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-pinopino-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的新手,不知道为什么它不是一个好的选择.
在响应发出后执行一些自定义代码的正确方法是什么?谢谢。

ma8fv8wu

ma8fv8wu1#

@Injectable()
export class SomeInterceptor implements NestInterceptor {
 constructor(--someurdeps--) {}

 async intercept(context: ExecutionContext, next: CallHandler) {
  return next
  .handle()
  .pipe(tap(()=>{
     const res = context.switchToHttp().getResponse();
     res.on('finish', ()=>{
      --ur logic after response is sent--
     });
   });
 }
}

因此异常不会破坏您应用程序

相关问题