Posterior a indagar en varios repositorios y páginas de internet al terminar nos encontramos con la respuesta que te compartimos ahora.
Solución:
Sugeriría crear un interceptor que aproveche la biblioteca de transformadores de clase:
@Injectable()
export class TransformInterceptor implements NestInterceptor
intercept(
context: ExecutionContext,
call$: Observable,
): Observable
return call$.pipe(map(data => classToPlain(data)));
Luego, simplemente excluya propiedades usando @Exclude()
decorador, por ejemplo:
import Exclude from 'class-transformer';
export class User
id: number;
email: string;
@Exclude()
password: string;
Puede sobrescribir el método toJSON del modelo de esta manera.
@Entity()
export class User extends BaseAbstractEntity implements IUser
static passwordMinLength: number = 7;
@ApiModelProperty( example: faker.internet.email() )
@IsEmail()
@Column( unique: true )
email: string;
@IsOptional()
@IsString()
@MinLength(User.passwordMinLength)
@Exclude( toPlainOnly: true )
@Column( select: false )
password: string;
@IsOptional()
@IsString()
@Exclude( toPlainOnly: true )
@Column( select: false )
passwordSalt: string;
toJSON()
return classToPlain(this);
validatePassword(password: string) !this.passwordSalt)
return false;
return comparedToHashed(password, this.password, this.passwordSalt);
Usando el método de transformador de clase de plainToClass junto con el @Excluir( a Solo simple: true ), la contraseña se excluirá de la respuesta JSON, pero estará disponible en la instancia del modelo. Me gusta esta solución porque mantiene toda la configuración del modelo en la entidad.
Como complemento a la respuesta de Kamil:
En lugar de crear su propio interceptor, ahora puede usar el integrado ClassSerializerInterceptor
consulte los documentos de serialización.
@UseInterceptors(ClassSerializerInterceptor)
Puede usarlo en una clase de controlador o en sus métodos individuales. Cada entidad devuelta por dicho método se transformará con class-transformer y, por lo tanto, tomará el @Exclude
anotaciones en cuenta:
import Exclude from 'class-transformer';
export class User
/** other properties */
@Exclude()
password: string;
Puede personalizar su comportamiento definiendo @SerializeOptions()
en su controlador o sus métodos:
@SerializeOptions(
excludePrefixes: ['_'],
groups: ['admin']
)
para, por ejemplo, exponer ciertos campos solo a ciertos usuarios:
@Expose( groups: ["admin"] )
adminInfo: string;
Reseñas y calificaciones del post
Al final de todo puedes encontrar las referencias de otros desarrolladores, tú aún tienes la opción de mostrar el tuyo si lo deseas.