graphql - 将 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();
}
由于以下几个原因,这不是一个好的实现:
- 我已经在缓存中提取了公寓,但我无法重复使用它,因为我必须再次获取公寓才能到达大楼。
- 对于公寓中的每一个关系,我都需要实现一个像这样的特殊函数来通过 apartemntId 获取该特定关系。这很浪费,并且错过了 prisma 为我实现大多数查询的要点。
有没有更好的方法来实现我所缺少的?
我知道棱镜绑定可以解决这个问题,但是:
- Prisma 客户端似乎是使用 primsa 的最新方式。
- 出于授权目的,prisma 客户端功能更强大。
解决方案
推荐阅读
- powerbi - ALL() 无法在 DAX 中“删除过滤器”;关系问题?
- amazon-web-services - PyCharm + AWS Toolkit 没有为 IDE 中的 sam 构建选择正确的 Python 版本
- directshow - Microsoft 的 MPEG-2 解复用器过滤器 - 我可以在图形运行时更改基本流引脚的 PID 吗?
- kotlin - 如何运行 Swagger Codegen 生成的 Kotlin 服务器?
- c++ - QLabel 不使用 QToolButton 显示图像
- java - 安卓电报客户端:如何获取最后一条消息?
- javascript - 基于对象数组验证相同的值
- html - 右侧页面底部的空白区域,左侧正确填充背景色
- apache-spark - 数据类型转换火花数据框列 - pyspark
- r - R - 使用向量作为函数的默认参数列表