AWS X-Ray支持Express和Restify中间件,但不支持Nest.js。Nest.js无法打开AWSXRay的段和关闭段,因为它使用typescript修饰进行路由。如何在Nest.js上使用AWS X-Ray
发布于 2019-07-24 14:17:49
嗯,这是其中一种情况,可能非常有趣,也很难处理。当然,您可以在标准的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将成为一个错误处理程序,就像过滤器一样,所以我不确定否则您将如何捕获错误。也许过滤器是最好的途径,你可能只需要在这里玩弄想法。希望有人能给出更多的见解。
https://stackoverflow.com/questions/57175336
复制相似问题