Я создаю серверную часть приложения, используя узел и экспресс.
Я разделил разные части кода в разных файлах: например, все, что касается доступа к базе данных, находится в файле DBService.js, и если я хочу выполнить какое-либо действие, связанное с моими пользователями, у меня есть файл UserService.js, который выполняет все приложение нуждается в пользователях и использует DBService.js для сохранения пользователей в БД.
Я знаю, что в моем коде есть некоторые циклические зависимости, но до сих пор все работало нормально. Я использую GraphQL практически для всего, но добавляю обычную конечную точку для захвата файла, учитывая его идентификатор.
Мне требуется FileService.js в index.js (точка входа в приложение узла) для обслуживания файла, и эта часть работает хорошо. Проблема в том, что в другом файле (ZoneService.js), где мне также требуется FileService.js, он возвращает пустой объект.
Я точно знаю, что это проблема, потому что, если я уберу требование в файле index.js, проблема исчезнет.
Это пути, которые ведут к круговым зависимостям. '->' означает, что предыдущий Сервис требует следующего.
FileService -> ZoneService -> FileService
FileService -> ZoneService -> FileUploadService -> FileService
Это может выглядеть глупо, но я нуждаюсь в этом, потому что я подумал, что было бы неплохо сохранить определения и графики для каждого типа сущности graphQL в своем собственном файле.
Я попытаюсь объяснить мои рассуждения о первом пути:
- Я хочу получить файлы из определенной зоны, поэтому эта функция переходит в FileService. Затем я использую ZoneService для получения идентификатора файла с указанным идентификатором зоны, затем получаю пути из БД
- ZoneService необходим FileService для разрешения поля «файлы» в объекте зоны
Я мог бы просто переместить эту функцию в ZoneService и получить оттуда файлы, но это как бы нарушило всю мою логику разделения проблем.
То, что я хотел бы знать, - это лучший способ исправить это, чтобы это больше не повторилось, и как этого можно избежать.
Я бы опубликовал код, но я не уверен, что так, если вы считаете, что это необходимо, дайте мне знать.
Заранее спасибо!
Редактировать - вот код:
FileService.js
//Import services to use in resolvers
const EditService = require("./EditService.js")
const ZoneService = require("./ZoneService.js")
//Resolvers
const resolvers = {
Query: {
getFileById: (parent, {_id}) => {
return getFileById(_id)
},
getFilesById: (parent, {ids}) => {
return getFilesById(ids)
},
getFilesByZoneId: (parent, {_id}) => {
return getFilesByZoneId(_id)
},
},
File: {
editHistory: file => {
return EditService.getEditsById(file.editHistory)
},
fileName: file => {
return file.path.split('\\').pop().split('/').pop();
},
zone: file => {
return ZoneService.getZoneById(file.zone)
}
}
}
ZoneService.js
//Import services to use in resolvers
const UserService = require("./UserService.js")
const FileService = require("./FileService.js")
const EditService = require("./EditService.js")
const ErrorService = require("./ErrorService.js")
const FileUploadService = require("./FileUploadService.js")
//Resolvers
const resolvers = {
Query: {
getZone: (parent, {_id, label}) => {
return _id ? getZoneById(_id) : getZoneByLabel(label)
},
getZones: () => {
return getZones()
},
},
Zone: {
author: zone => {
return UserService.getUserById(zone.author)
},
files: zone => {
if(zone.files && zone.files.length > 0) return FileService.getFilesById(zone.files)
else return []
},
editHistory: zone => {
return EditService.getEditsById(zone.editHistory)
}
},
Mutation: {
createZone: async (parent, input, { loggedUser }) => {
return insertZone(input, loggedUser)
},
editZone: async (parent, input, { loggedUser }) => {
return editZone(input, loggedUser)
},
removeZone: async (parent, input, { loggedUser }) => {
return removeZone(input, loggedUser)
}
},
}