首页 > 解决方案 > 将 prisma 客户端与关系解析器一起使用

问题描述

我在我的 graphql 服务器中使用prisma 客户端。

遵循最佳实践,我将解析器层设置为一个薄层,它将实际获取数据的任务委托给数据访问层。数据访问层还使用dataloader 执行授权和请求级缓存等操作。

我找不到在此设置中获取实体关系的好方法,因为 prisma 客户端使用 promise 对象上的函数调用链来获取关系,但是由于我的解析器不直接调用 prisma 客户端,它没有访问权限到 prisma 客户端承诺,因此不能调用链式关系函数。

请参见以下示例:

样本数据模型:

type Apartment {
  id:               ID!
  floor:            Int
  building:         Building        @pgRelation(column: "building_id")
}

type Building {
  id:               ID!
  buildingNumber:   Int
}

公寓解析器示例:

module.exports = {
  Query: {
    apartment: async (parent, { where }, { apartmentDAO }) => {
      return apartmentDAO.apartment(where);
    }
  },
  Apartment: {
    building: async (parent, args, { buildingDAO }) => {
      return buildingDAO.buildingByApartmentId(parent.id);
    }
  }
};

buildingByApartmentId数据访问层的示例实现:

buildingByApartmentId: (apartmentId) => {
  // Some authorization logic goes here
  // Some other common data access logic goes here
  // ....
  return prismaClient.apartment({ id: apartmentId }).building();
}

由于以下几个原因,这不是一个好的实现:

  1. 我已经在缓存中提取了公寓,但我无法重复使用它,因为我必须再次获取公寓才能到达大楼。
  2. 对于公寓中的每一个关系,我都需要实现一个像这样的特殊函数来通过 apartemntId 获取该特定关系。这很浪费,并且错过了 prisma 为我实现大多数查询的要点。

有没有更好的方法来实现我所缺少的?

我知道棱镜绑定可以解决这个问题,但是:

  1. Prisma 客户端似乎是使用 primsa 的最新方式。
  2. 出于授权目的,prisma 客户端功能更强大。

标签: graphqlprismagraphcoolprisma-graphql

解决方案


推荐阅读