请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于拦截器想请教老师

在写代码的时候发现在查询数据时通过relation获取的关联关系entity中的数据无法正常拦截,代码如下:
blog.controller.ts

  @Get()
  @UseInterceptors(new SerializeInterceptor(GetAllBlogDto))
  findAll() {
    return this.blogService.findAll();
  }

blog.Service.ts

...
  async findAll() {
    return await this.blogRepository.find({
      where: { isDelete: false, published: true },
      relations: ['image'],
    });
  }

GetAllBlogDto.ts

import { Expose } from 'class-transformer';
import { IsNotEmpty, IsNumber, IsString } from 'class-validator';
import { Image } from '../../image/entities/image.entity';

class ImageDto extends Image {
  @IsString()
  @IsNotEmpty()
  @Expose()
  url: string;
}

export class GetAllBlogDto {
  @IsNumber()
  @IsNotEmpty()
  @Expose()
  id: number;

  @IsString()
  @IsNotEmpty()
  @Expose()
  blogTitle: string;

  @IsString()
  @IsNotEmpty()
  @Expose()
  summary: string;

  @IsString()
  @IsNotEmpty()
  @Expose()
  image: ImageDto;
}

通过上面代码想要获取这样的数据:

[
	{
		id:1,
		blogTitle: **,
		summary:**,
		image: {
			url: **,
		}
	},
	{....}
]

但获取到的数据中image一直为空对象,除了在image的entity中添加@Expose()外,请问老师还有没有其它办法?
非常感谢!

正在回答 回答被采纳积分+3

1回答

  • 提问者 LinkeZ #1
    不好意思老师,问题我没有说清楚。blog和image两个实体有许多字段,每个controller的路径需要返回的数据字段不完全一样。现在如果给需要的字段设置上@Expose(),那之后有的controller也许就不需要这个字段。现在遇到的困难就是在查询数据时relations查询到的关联的数据无法正常的通过拦截器,要么返回的是空数据,要么就只能给需要的关联的实体字段加@Expose(),如果不加@Expose(),那么这个DTO应该如何写呢?上面问题中的GetAllBlogDto.ts代码中,ImageDto继承了Image实体,然后给Image实体中的URL字段加上了@Expose(),也是无法通过拦截器,是我的思路不对吗?还请老师指导,谢谢。
    回复 有任何疑惑可以回复我~ 2023-08-16 22:13:01
  • Brian 回复 提问者 LinkeZ #2
    那之后有的controller也许就不需要这个字段——你可以考虑,在后面的controller再创建一个dto
    回复 有任何疑惑可以回复我~ 2023-08-22 19:51:01
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信