Graphql 使用带关系解析程序的prisma客户端
我正在graphql服务器中使用 按照最佳实践,我使解析器层只是一个薄薄的层,它将数据的实际获取委托给数据访问层。数据访问层还使用以下功能执行授权和请求级缓存 在此设置中,我找不到获取实体关系的好方法,因为prisma client使用promise对象上函数调用的链接来获取关系,但由于我的解析器没有直接调用prisma client,因此它无法访问prisma client promise,因此无法调用链接关系函数 请参见以下示例: 样本数据模型:Graphql 使用带关系解析程序的prisma客户端,graphql,prisma,graphcool,prisma-graphql,Graphql,Prisma,Graphcool,Prisma Graphql,我正在graphql服务器中使用 按照最佳实践,我使解析器层只是一个薄薄的层,它将数据的实际获取委托给数据访问层。数据访问层还使用以下功能执行授权和请求级缓存 在此设置中,我找不到获取实体关系的好方法,因为prisma client使用promise对象上函数调用的链接来获取关系,但由于我的解析器没有直接调用prisma client,因此它无法访问prisma client promise,因此无法调用链接关系函数 请参见以下示例: 样本数据模型: type Apartment { id:
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();
}
这不是一个好的实现,原因如下:
您好@brafdlog,我对您的解析器设置有点困惑。从
上下文
检索的apartmentDAO
和buildingDAO
对象来自哪里?通常,在解析器中获取关系不应该是一个问题,因为Prisma客户端有一个内置的数据加载器,并将批处理发送到Prisma的请求。我们有与Prisma客户建立关系的参考资料。这种方法与使用Prisma绑定一样有效。Hi@nburk,DAO是在上下文中传递的。原因是每个DAO都使用一个dataloader来缓存同一请求中的调用,因此我为每个请求创建一个实例。我不知道prisma客户端在内部使用数据加载器,这可能会使我的内部加载器冗余。但问题仍然存在——与DAOs的分离是为了常见的获取逻辑,如授权、日志等。不希望在每个解析器中重复该操作。顺便说一句,关于prisma客户端中的数据加载器是如何工作的,有什么参考资料吗?不幸的是,我们的文档目前还没有,所以我们没有任何关于prisma客户端中数据加载器是如何工作的文档。我们很快会补充这一点。同时,GitHub问题可能有助于获得更多的上下文。谢谢。对如何改进此实现有何见解?如果我能得到相关实体的ID,这本身就可以解决冗余查询,但我认为这目前是不可能的。