【问题标题】:How to use the AWS X-Ray with Nest.js?如何将 AWS X-Ray 与 Nest.js 结合使用?
【发布时间】:2019-07-24 14:17:49
【问题描述】:

AWS X-Ray 支持 Express 和 Restify 中间件,但不支持 Nest.js。 Nest.js 无法打开和关闭 AWSXRay 的段,因为它使用打字稿装饰进行路由。 如何将 AWS X-Ray 与 Nest.js 结合使用

【问题讨论】:

    标签: nestjs


    【解决方案1】:

    嗯,这是可能非常有趣且难以处理的情况之一。您当然可以在标准 Nest 中间件(看起来就像 Express 中间件)中设置 openSegement 调用,但 closeSegment 有点困难。我认为(我在这里做了一个很长的镜头,因为我没有真正的方法来测试它)你可以创建一个拦截器并将HttpAdapter 注入其中,在发出请求之前检查传入路由并查看它是否是一条您想用 X 射线覆盖的路线,如果是这样,请标记一个布尔值并在可观察响应 (next.handle()) 中获取HttpAdapter 实例并调用closeSegment 函数。换句话说(这将是非常粗略的代码):

    import { Injectable, NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common';
    import { HttpAdapterHost } from '@nesjts/core';
    import { Observable } from 'rxjs';
    import { tap } from 'rxjs/operators';
    import * as xRay from 'aws-xray-sdk-express';
    
    @Injectable
    export class XRayInterceptor implements NestInterceptor {
      constructor(private readonly httpAdapter: HttpAdapterHost) {}
    
      intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
        let coverRoute = false;
        const req = context.switchToHttp().getRequest();
        if (req.path === 'yourPath') {
          coverRoute = true;
        }
        return next.handle()
          .pipe(
            tap(() => (coverRoute && this.httpAdapter.use(xRay.xrayExpress.closeSegment()))
          );
    }
    

    您也可以在拦截器中设置openSegment,但同样,所有这些都未经测试,可能无法按预期工作。我只是想办法让这成为可能。如果无法访问错误处理中间件,您的选择将是查看拦截器和过滤器,似乎closeSegement 将成为过滤器一样的错误处理程序,所以我不确定您将如何捕获错误。也许过滤器是最好的途径,你可能只需要从这里开始尝试。希望有人可以提供更多见解。

    【讨论】:

      猜你喜欢
      • 2019-10-31
      • 2019-04-18
      • 2021-12-15
      • 2020-11-01
      • 2019-10-26
      • 2021-06-11
      • 2019-09-22
      • 2019-08-17
      • 1970-01-01
      相关资源
      最近更新 更多