[英]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.