Передать аргумент дочернего типа graphql

Я хотел бы знать, как я могу передать аргумент в «дочернем» типе. С запросом я хотел бы иметь только сообщение с идентификатором 1 от пользователя с идентификатором 1.

В настоящее время у меня есть этот запрос:

{user(id:1){
  email,
  username,
  messages(id:1){
    text,
    id
  }
}}

Я изменил в схеме тип пользователя и изменил

messages: [Message]

к

messages(id: Int): [Message]

Но у меня всегда есть все сообщения от пользователя, а не сообщение с определенным идентификатором.

схема.js

import { gql } from 'apollo-server';

export const typeDefs = gql`

  # declare custom scalars
  scalar Date

  ##########
  ## TYPE ##
  ##########

  # a group
    type Group {
      id: Int!
      name: String
      users: [User]!
      messages: [Message]
    }

  # a user
  type User {
    id: Int! # unique id for the user
    email: String!
    username: String
    messages(id: Int): [Message]
    groups: [Group]
    friends: [User]
  }

  # a message sent from a user to a group
  type Message {
    id: Int!
    to: Group!
    from: User!
    text: String!
    createdAt: Date!
  }

  ###########
  ## QUERY ##
  ###########

  # query for types
  type Query {
    user(email: String, id: Int): User

    messages(groupId: Int, userId: Int): [Message]
  }

  schema {
    query: Query
  }
`;

export default typeDefs;

разрешители.js

import GraphQLDate from 'graphql-date';
import { Group, Message, User } from './connectors';

export const resolvers = {
    Date: GraphQLDate,
    Query: {
        group(_, args) {
            return Group.find({ where: args });
        },
        messages(_, args) {
            return Message.findAll({
                where: args,
                order: [['createdAt', 'DESC']],
            });
        },
        user(_, args) {
            return User.findOne({ where: args });
        },
    },
    Group: {
        users(group) {
            return group.getUsers();
        },
        messages(group) {
            return Message.findAll({
                where: { groupId: group.id },
                order: [['createdAt', 'DESC']],
            });
        },
    },
    Message: {
        to(message) {
            return message.getGroup();
        },
        from(message) {
            return message.getUser();
        },
    },
    User: {
        messages(user) {
            return Message.findAll({
                where: { userId: user.id },
                order: [['createdAt', 'DESC']],
            });
        },
        groups(user) {
            return user.getGroups();
        },
        friends(user) {
            return user.getFriends();
        },
    },
};

export default resolvers;
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Что такое Apollo Client и зачем он нужен?
Что такое Apollo Client и зачем он нужен?
Apollo Client - это полнофункциональный клиент GraphQL для JavaScript-приложений, который упрощает получение, управление и обновление данных в...
0
0
378
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы должны обновить User.messages резолвер. Сюда:

User: {
        messages(user, { id }) {
            return Message.findAll({
                where: { userId: user.id, id },
                order: [['createdAt', 'DESC']],
            });
        },
        groups(user) {
            return user.getGroups();
        },
        friends(user) {
            return user.getFriends();
        },
    },

Если вы хотите сделать параметр id необязательным, может помочь что-то вроде этого:

    messages(user, { id }) {
        const where = { userId: user.id }
        if (id) {
          where.id = id
        }

        return Message.findAll({
            where,
            order: [['createdAt', 'DESC']],
        });
    },

Что, если тип вложенного объекта использует логические аргументы вместо целых чисел? Кроме того, требуется ли, чтобы ВСЕ запрошенные типы были перечислены в типе Query, даже если я должен запрашивать их только как вложенные? Будет ли большая разница, если код будет написан в соответствии с форматом объекта GraphQL SDL или GraphQLSchema?

goldenmaza 04.08.2020 17:03

Другие вопросы по теме

Then() в обещании всегда выполняется, что находится в компоненте Vue, даже если я получаю сообщение об ошибке от catch(), которое находится в действии Vuex
Повторная загрузка запроса с помощью react-apollo: почему «загрузка» не соответствует действительности?
Apollo: получение данных как устаревших для некоторых фильтров в запросе
Как перезагрузить данные tableView внутри функции выполнения (мутация: GraphQLMutation)?
Опущен необязательный ввод, установленный на null вместо неопределенного
React-Apollo: запрос с переменными приводит к тому, что пользовательский интерфейс больше не оптимистичен
API-интерфейсы Apollo и сторонних разработчиков. Должен ли я хранить сторонние данные в базе данных
Ошибка получения. Хуки можно вызывать только внутри тела функционального компонента при реализации базового примера React Spring
Как исправить ошибку: в react ssr graphql поддерживаются только абсолютные URL-адреса
Как сопоставлять запросы с refetchQuery от Apollo