Я застрял в своем распознавателе GraphQL, выбирая списки задач для конкретного пользователя, принадлежащего компании.В зависимости от того, имеют ли они доступ ко всем спискам задач или к некоторым из них, он будет выбирать группы, в которых зарегистрированный пользователь имеет принадлежащие списки задач, и они должны быть выбраны.
Код на данный моментспособен регистрировать запрошенные списки задач по запросу, но мне еще не пришло решение о том, как на самом деле возвращать данные всех списков задач зарегистрированных групп пользователей.
Я решил экспортировать фактическиелогика в отдельную функцию
Resolver:
allowedListItems: {
type: new GraphQLList(TodoItem),
resolve(parentValue, args) {
return Promise.all([fetchAllowedItems(parentValue._id)]);
}
},
Функция Promise
function fetchAllowedItems(userId) {
return User.findOne({ _id: userId }).then((user) => {
if (user.todoGroups) {
return user.todoGroups.map((groupId) => {
return TodoGroup.findOne({ _id: groupId }).then(group => {
return group.todoLists.map((listId) => {
return TodoList.findOne({ _id: listId })
})
})
})
} else {
return TodoList.find({ company: parentValue.company }).exec();
}
})
}
Я не получаю никаких ошибок от GraphQL, поэтому я думаю, что это о том, какЯ делаю обещания, возвращаюсь к распознавателю, я был бы очень признателен, если бы вы мне помогли!
Обновление:
Я должен обернуть карты в Promise.all, как отображениевозвращает массив.Хотя обновленный код не приводит к улучшению возвращаемых данных.
async resolve(parentValue, args) {
let user = await User.findOne({ _id: parentValue._id })
if (user.todoGroups) {
return Promise.all(user.todoGroups.map((groupId) => {
return TodoGroup.findOne({ _id: groupId }).then(group => {
return Promise.all(group.todoLists.map((listId) => {
return TodoList.findOne({ _id: listId });
}))
})
}))
} else {
return TodoList.find({ company: parentValue.company }).exec();
}
}
},
Текущий результат запроса:
{
"data": {
"user": {
"_id": "5ba11690ad7a93d2b34d21a9",
"allowedTodos": [
{
"_id": null,
"title": null
}
]
}
}
}