Пн goose: вызов резолвера в другом резольвере - PullRequest
0 голосов
/ 19 апреля 2020

У меня есть пользователи, подписывающиеся на события:

const EventType = new GraphQLObjectType({
    name:'Event',
    fields:() => ({
        id: {type:GraphQLID}  
     })
});


const UserType = new GraphQLObjectType({
    name:'User',
    fields:() => ({
        id: {type:GraphQLString},
        _subscriptionIds: { type: new GraphQLList(GraphQLID) },
        subscriptions: { 
            type: new GraphQLList(EventType),
            async resolve(parent, args) {
                return Event.find( {_id: { $in: parent._subscriptionIds}})
            }
         }
         anotherField: {
            type: new AnotherType,
            async resolve(parent, args) {
                console.log(parent.subscriptions) // parent.subscriptions is undefined, I need to resolve it.
            }               
     })
});

Короче говоря, мне нужно получить доступ к parent.subscription (которые имеют тип Event) в распознавателе anotherField. своего рода «принудительный вызов» распознавателя подписок.

Возможно и как?

Спасибо! :)

1 Ответ

1 голос
/ 19 апреля 2020

Обычно вы никогда не должны вызывать одного распознавателя из другого. Если у вас есть код, общий для двух или более распознавателей, вы можете извлечь этот код в его собственную функцию (и, возможно, в отдельный модуль) и просто вызвать его из обоих преобразователей.

Таким образом, ваш код может выглядеть примерно так :

subscriptions: { 
  type: new GraphQLList(EventType),
  async resolve(parent, args) {
    return getSubscriptionsByIds(parent._subscriptionIds)
  },
},
anotherField: {
  type: new AnotherType,
  async resolve(parent, args) {
    const subscriptions = await getSubscriptionsByIds(parent._subscriptionIds)
    // do something else with the subscriptions here
  },    
},

Однако это приведет к дополнительным вызовам в вашу базу данных, если вы уже не используете DataLoader для пакетных вызовов, подобных этому. Лучшим решением было бы переместить логи выбора подписки c на уровень (т. Е. Куда бы вы ни брали свой список пользователей). Вы можете быстро загрузить подписки, используя populate или $lookup, тогда они будут доступны через аргумент parent внутри каждого распознавателя полей пользователя.

...