AWS X-Ray支持Express和Restify中间件,但不支持Nest.js。 Nest.js无法打开和关闭AWSXRay的段,因为它使用打字稿装饰进行路由。 如何在Nest.js中使用AWS X-Ray
答案 0 :(得分:0)
嗯,这是可能非常有趣且难以使用的情况之一。当然,您可以在标准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
就像过滤器一样,将是一个错误处理程序,因此我不确定您如何捕获错误。也许过滤器是最好的方法,您可能只需要从这里开始思考。希望有人能提供更多见识。