GraphQL: генерировать длинный запрос, пока я выбираю только один столбец (название продукта) - PullRequest
0 голосов
/ 22 февраля 2020

Я использую postgres & GraphQL & Nest JS с TypeScript И typeORM

Мой запрос GraphQL:

{
   Product { 
    name 
   }
}

Но в журналах запросов я вижу, что сгенерированный запрос :

SELECT 
 "ProductEntity"."id" AS "ProductEntity_id",
 "ProductEntity"."name" AS "ProductEntity_name",
 "ProductEntity"."description" AS "ProductEntity_description",
 "ProductEntity"."price" AS "ProductEntity_price" 
FROM "product" "ProductEntity"

так почему бы не просто так?

SELECT 
     "ProductEntity"."name" AS "ProductEntity_name",
FROM "product" "ProductEntity"

Пожалуйста, найдите Resolver продукта ниже:

@Resolver('product')
export class ProductResolver {
  constructor(private readonly productService: ProductService) {}

  @Query()
  async product() {
    return this.productService.getProducts();
  }

}

Служба продукта:

@Injectable()
export class ProductService {
  constructor(
    @InjectRepository(ProductEntity)
    private readonly productRepository: Repository<ProductEntity>,
  ) {}


  async getProducts() {
    return await this.productRepository.find();
  }

}

1 Ответ

0 голосов
/ 23 февраля 2020

Как сказал Дэниел Рарден, это больше проблема с ORM, который вы используете. Большинство ORM собирают как можно больше информации, если вы не скажете им иначе. Более того, вы, ORM, понятия не имеете, какую информацию запрашивает запрос GraphQL, поэтому не могут определить, какие поля нужно извлечь. Скорее ORM извлекает все возможные поля и сопоставляет их с объектом, а затем передает его в распознаватель GraphQL, где GraphQL удаляет ненужные и отправляет ответ обратно клиенту. Таким образом, независимо от того, запрашивали ли вы 5 или 50 полей, все они доступны для распознавателя GrpahQL. Вероятно, вы могли бы научиться читать, какие поля запрашиваются, а затем заставить ORM возвращать только эти поля, но это потребует значительного тестирования и достаточно хорошего понимания того, как работает контекст GQL.

...