简体   繁体   English

nestjs:将数据从服务注入到拦截器

[英]nestjs: inject data from service to interceptor

I have services like this我有这样的服务

async create(dto: MyDTO): Promise<MyEntity> {
    const data = this.repository.create(dto);
    return this.repository.save(data );
}

and I have an interceptor like this:我有一个这样的拦截器:

@Injectable()
export class MyInterceptor implements NestInterceptor {
  intercept(context: ExecutionContext, next: CallHandler<any>): Observable<any> | Promise<Observable<any>> {    
    return next.handle().pipe(
      map(data => {
        return {
          Error: false,
          data
        };
      }),
    );
  }
}

I want to pass the message from the service to the interceptor like this我想像这样将消息从服​​务传递给拦截器

async create(dto: MyDTO): Promise<MyEntity> {
    const data = this.repository.create(dto);
    let message ="insert successful"
    return this.repository.save(data );
}

and in my interceptor use it like this在我的拦截器中像这样使用它

@Injectable()
export class MyInterceptor implements NestInterceptor {
  intercept(context: ExecutionContext, next: CallHandler<any>): Observable<any> | Promise<Observable<any>> {    
    return next.handle().pipe(
      map(data => {
        return {
          Error: false,
          data,
          message
        };
      }),
    );
  }
}

What should I do?我应该怎么办?

You can try something along these lines, assuming your controller is like this:假设您的 controller 是这样的,您可以尝试这些方法:

@Post()
async create(@Body(new ValidationPipe()) body: MyDto)  
{
  return this.myEntityService.createOrganisation(body);
}

Create a new model extending the Request model, like this:创建一个新的 model 扩展Request model,如下所示:

export interface ExtendedRequestModel extends Request {
  successMessage: string
}

Fetch the request object in the controller and pass it to the service layer.获取 controller 中的请求 object 并传递给服务层。

@Post()
async create(@Body(new ValidationPipe()) body: MyDto, @Req() request: ExtendedRequestModel)  
{
  return this.myEntityService.createOrganisation(body, request);
}

async create(dto: MyDTO, request: ExtendedRequestModel): Promise<MyEntity> {
    const data = this.repository.create(dto);
    request.successMessage ="insert successful";
    return this.repository.save(data);
}

@Injectable()
export class MyInterceptor implements NestInterceptor {
  intercept(context: ExecutionContext, next: CallHandler<any>): Observable<any> | Promise<Observable<any>> {
    let req: ExtendedRequestModel;
    req = context.switchToHttp().getRequest();    
    return next.handle().pipe(
      map(data => {
        return {
          error: false,
          message: req.successMessage,
          data
        };
      }),
    ).pipe(catchError((err) => {
       throwError(() => new InternalServerErrorException(err))
   }));
  }
}

It's not tested, hopefully, you got the idea.它没有经过测试,希望你明白了。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM