我在我的 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();
}
由于以下几个原因,这不是一个好的实现:
- 我已经在缓存中提取了公寓,但我无法重复使用它,因为我必须再次获取公寓才能到达大楼。
- 对于公寓中的每一个关系,我都需要实现一个像这样的特殊函数来通过 apartemntId 获取该特定关系。这很浪费,并且错过了 prisma 为我实现大多数查询的要点。
有没有更好的方法来实现我所缺少的?
我知道棱镜绑定可以解决这个问题,但是:
- Prisma 客户端似乎是使用 primsa 的最新方式。
- 出于授权目的,prisma 客户端功能更强大。