【发布时间】:2019-07-24 14:17:49
【问题描述】:
AWS X-Ray 支持 Express 和 Restify 中间件,但不支持 Nest.js。 Nest.js 无法打开和关闭 AWSXRay 的段,因为它使用打字稿装饰进行路由。 如何将 AWS X-Ray 与 Nest.js 结合使用
【问题讨论】:
标签: nestjs
AWS X-Ray 支持 Express 和 Restify 中间件,但不支持 Nest.js。 Nest.js 无法打开和关闭 AWSXRay 的段,因为它使用打字稿装饰进行路由。 如何将 AWS X-Ray 与 Nest.js 结合使用
【问题讨论】:
标签: nestjs
嗯,这是可能非常有趣且难以处理的情况之一。您当然可以在标准 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 将成为过滤器一样的错误处理程序,所以我不确定您将如何捕获错误。也许过滤器是最好的途径,你可能只需要从这里开始尝试。希望有人可以提供更多见解。
【讨论】: