получение данных из БД отличных от GraphiQL - PullRequest
0 голосов
/ 26 февраля 2019

Я новичок в graphQL и mongoDB и пытаюсь заставить его работать в моем проекте.Проблема в данных из запроса, которые в GraphiQL полностью отличаются от данных из того же запроса на моей стороне клиента.Вот мои настройки схемы:

const graphql = require('graphql');
const _ = require('lodash');
const Item = require('../models/item');
const {
  GraphQLObjectType,
  GraphQLString,
  GraphQLSchema,
  GraphQLID,
  GraphQLInt,
  GraphQLList
} = graphql;

const ItemType = new GraphQLObjectType({
  name: 'Item',
  fields: () => ({
    name: {
      type: GraphQLString
    },
    id: {
      type: GraphQLID
    },
    description: {
      type: GraphQLString
    },
    price: {
      type: GraphQLInt
    },
    image: {
      type: GraphQLString
    },
    category: {
      type: GraphQLString
    }
  })
});

const RootQuery = new GraphQLObjectType({
  name: 'RootQueryType',
  fields: {
    item: {
      type: ItemType,
      args: {
        id: {
          type: GraphQLID
        }
      },
      resolve(parent, args) {
        // code to get data from db / other source
        return Item.findById(args.id);
      }
    },
    items: {
      type: new GraphQLList(ItemType),
      resolve(parent, args) {
        return Item.find({})
      }
    }
  }
});

Когда я делаю запрос из graphiQL обо всех итерациях и данных, которые я получаю, это «правильный».Это выглядит так: enter image description here

Когда я делаю тот же самый точный запрос из внешнего интерфейса, вот так: import {gql} from "apollo-boost";

const getItemsQuery = gql`
  {
    items {
      name
      id
      description
      price
      image
      category
    }
  }
`;

export { getItemsQuery };

Данные выглядят так: enter image description here

Похоже, это повторяет первый пункт снова и снова, и я не понимаю, почему.БД также показывает нужные элементы.Код моего сервера можно найти здесь: https://github.com/KamilStaszewski/shoppy/tree/adding_graphQL/server enter image description here

1 Ответ

0 голосов
/ 28 февраля 2019

Из документов :

InMemoryCache нормализует ваши данные перед сохранением в хранилище путем разделения результата на отдельные объекты, создания уникального идентификатора для каждого объекта ихранение этих объектов в плоской структуре данных.По умолчанию InMemoryCache будет пытаться использовать общеизвестные первичные ключи id и _id для уникального идентификатора, если они существуют вместе с __typename для объекта.

Другими словами, Apollo будет использовать оба __typename и id для создания ключа кэша для каждого Item выбранного вами.Этот ключ используется для извлечения соответствующего элемента из кэша.Проблема в том, что ваши предметы возвращают null за их id.В результате каждый элемент пишется с одним и тем же ключом.В результате, когда ваш результат запроса возвращается из кэша, он ищет один и тот же ключ для каждого элемента в вашем массиве items.

Чтобы устранить эту проблему, необходимо убедиться, что ваш API возвращаетзначение для id.Я не так много работал с mongoose, но, думаю, поскольку mongoose автоматически добавляет для вас поле id на основе _id, достаточно просто удалить id из вашей модели mongoose (а не GraphQL)тип).В качестве альтернативы вы можете попробовать добавить функцию разрешения в поле id в типе GraphQL:

resolve: (item) => item._id.toString()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...