将prisma客户端与关系解析器一起使用

时间:2019-01-16 21:14:17

标签: graphql prisma graphcool prisma-graphql

我在我的graphql服务器中使用prisma client

按照最佳实践,我将解析程序层做成一个薄层,将实际的数据获取委托给数据访问层。数据访问层还使用dataloader执行授权和请求级别缓存之类的事情。

在此设置中,我找不到一种获取实体关系的好方法,因为prismaa客户端在promise对象上使用函数调用链来获取关系,但是由于我的解析器未直接调用prismaa客户端,因此它不会无法访问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. 对于公寓中的每个关系,我都需要实现一个类似的特殊功能,以便通过appartemntId获取该特定关系。这很浪费,错过了达到我大多数查询要求的程度。

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

我知道棱柱式装订将解决此问题,但是:

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

0 个答案:

没有答案