NestJs-如何修改拦截器

时间:2020-08-24 10:17:50

标签: node.js 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。它是空的。只有用户已签名。

我认为拦截器中有一些逻辑可以添加该属性,但是我不确定该怎么做。实现此功能的最佳方法是什么?

1 个答案:

答案 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。