我从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。它是空的。只有用户已签名。
我认为拦截器中有一些逻辑可以添加该属性,但是我不确定该怎么做。实现此功能的最佳方法是什么?
答案 0 :(得分:0)
我设法不使用拦截器解决问题。
我使用了两个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。