Я использую клиент Prisma на моем сервере GraphQL.
Следуя рекомендациям, я сделал слой распознавателя просто тонким слоем, который делегирует фактическую выборку данных слою доступа к данным. Уровень доступа к данным также выполняет такие вещи, как авторизация и кэширование на уровне запросов с использованием dataloader .
Я не могу найти хороший способ извлечения отношений сущностей в этой настройке, потому что клиент 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 кажется более современным способом использования primsa.
- Для авторизации клиент prisma намного мощнее.