如何解决NestJs-如何修改拦截器
我从NestJS控制器收到以下JSON响应:
{
"data": [{ ... users ... }]
}
要实现此“包围”功能,我使用拦截器:
import {
Injectable,NestInterceptor,ExecutionContext,CallHandler,} from '@nestjs/common'
import { Observable } from 'rxjs'
import { map } from 'rxjs/operators'
import { plainToClass } from 'class-transformer'
import { ResponseObjectInterface } from './response-object.interface'
interface ClassType<T> {
new (): T
}
@Injectable()
export class TransformInterceptor<T>
implements NestInterceptor<Partial<T>,ResponseObjectInterface<T> | T> {
constructor(
private readonly classType: ClassType<T>,private readonly envelope = true
) {}
intercept(
context: ExecutionContext,next: CallHandler
): Observable<ResponseObjectInterface<T> | T> {
return next
.handle()
.pipe(
map(data =>
this.envelope
? { data: plainToClass(this.classType,data) }
: plainToClass(this.classType,data)
)
)
}
}
它按预期工作。 现在,我必须对其进行更改,并在响应上添加另一个根属性。这个:
{
"data": { ... user ... },"_signed": "jwt" --> String or NULL
}
我还有其他对象(产品,订阅...等)。它们都具有相同的JSON签名。但是它们的_signed中将为NULL。它是空的。只有用户已签名。
我认为拦截器中有一些逻辑可以添加该属性,但是我不确定该怎么做。实现此功能的最佳方法是什么?
解决方法
我设法不使用拦截器解决问题。
我使用了两个DTO对象的概念。一个是通用的,另一个是普通的。
To make story short:
import { IsNumber,IsString } from 'class-validator';
import { Exclude,Expose } from 'class-transformer';
import { ApiProperty } from '@nestjs/swagger';
@Exclude()
export class GenericResponse {
constructor(data) {
this.data = data
}
@Expose()
@IsNumber()
@ApiProperty()
data: any
public getData() {
return this.data
}
@Expose()
@IsString()
@ApiProperty()
private _sign: string;
public setSignedPayload(signedPayload: string) {
this._sign = signedPayload
}
public getSignedPayload() {
return this._sign
}
}
当我进入userService时,我设置了数据,也设置了jwt。 如果我在其他地方结束,则可以选择是否设置jwt。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。