как можно искать конкретного пользователя в graphql - PullRequest
0 голосов
/ 24 ноября 2018

Я пишу этот код на nodejs и сервере GraphQL.У меня было 2 коллекции в mongodb;Звезды и фильмы.Звезды сохраняют информацию о Звездах, которые действуют в лучших фильмах.и коллекция фильмов сохранить информацию о каждом фильме.когда я запрашиваю фильм, этот код возвращает мне весь фильм, сохраненный в моей базе данных.но как я могу изменить этот код, чтобы при поиске звезд или фильмов по определенному идентификатору этот код мог возвращать мне одного пользователя или звезду?

это моя схема:

    const {
    GraphQLSchema,
    GraphQLObjectType,
    GraphQLString,
    GraphQLInt,
    GraphQLNonNull,
    GraphQLList,
    GraphQLFloat
} = require("graphql");
const {Movie, User} = require('/home/fateme/imdb_final/db')


const starType = new GraphQLObjectType({
    name: "UserType",
    fields: {
      name: {
        type: GraphQLString,
        async resolve(objId) {
            const starFind = await User.findOne({ _id: objId})
            return starFind.name
        }
      },
      imdbId: {
        type: GraphQLString,
        async resolve(objId) {
            const starFind = await User.findOne({ _id: objId}) 
            return starFind.imdbId
        }
      }
    }
  });

const movieType = new GraphQLObjectType({
    name: "MovieType",
    fields: {
      title: {
        type: GraphQLString,
        async resolve(objId) {
            const movieFind = await Movie.findOne({ _id: objId._id})
            return movieFind.title
        }
      },
      year: {
        type: GraphQLInt,
        async resolve(objId) {
            const movieFind = await Movie.findOne({ _id: objId._id})
            return movieFind.year
        }
      },
      rate: {
        type: GraphQLFloat,
        async resolve(objId) {
            const movieFind = await Movie.findOne({ _id: objId._id})
            return movieFind.rating
        }
      },
      // rank: {
      //   type: GraphQLInt,
      //   async resolve(objId) {
      //       const movieFind = await Movie.findOne({ _id: objId._id})
      //       return movieFind.rank
      //   }
      // },
      director: {
        type: starType,
        async resolve(objId) {
            return objId.director

            // return userFind.name
        }
      },
      stars: {
        type: GraphQLList(starType),
        async resolve(objId) {
            return objId.stars

            // return userFind.name
        }
      },
    }
  });


  const queryType = new GraphQLObjectType({
    name: 'Query',
    fields: () => ({

        users: {
            type: GraphQLList(starType),
            async resolve() {

              const allStar = await User.find({})
              return  allStar._id
            }
          },

      movies: {
        type: GraphQLList(movieType),
        async resolve() {

            const allMovie = await Movie.find({})
            return  allMovie
          } 
        },
    })
  });

  const schema = new GraphQLSchema({
    query: queryType
  });

  module.exports = schema;

1 Ответ

0 голосов
/ 24 ноября 2018

В graphql-js вы можете установить тип объекта , который поддерживается объектом класса JavaScript.Если вы это сделаете, вам не нужно предоставлять отдельные средства распознавания для методов класса;поле GraphQL, соответствующее методу класса, просто вызовет этот метод и будет использовать результаты.

Используемая вами серверная библиотека GraphQL будет нести ответственность за распаковку ответа со списком объектов наТип списка GraphQL и диспетчерские вызовы распознавателя для определенного объекта из этого списка по мере необходимости.

На любом языке реализации хорошим общим шаблоном для GraphQL является следующий:

  • распознаватели корневого уровня (типы Query и Mutation) находят определенные объекты;и

  • распознаватели уровня объекта (в вашем примере UserType и MovieType) действуют на известные конкретные объекты, которые уже имеют представление уровня языка программирования.

То есть, если вы находитесь в функции распознавателя для определенного типа, вам не нужно снова искать этот объект;у вас уже должно быть это (в вашем случае из корневых обработчиков запросов).

Ваши реализации распознавателя проясняют, что у ваших объектов уже есть поля, которые соответствуют именам полей GraphQL, поэтому необходимо внести два изменения:Заставить распознаватель корневого уровня предоставить конкретный объект:

const root = {
  users: async () => User.find({}),
  movies: async () => Movie.find({})
}

и просто предоставить схему, которая напрямую отражает существующий макет объекта:

const schema = buildSchema(`
  type UserType {
    name: String
    imdbId: String
  }
  type MovieType {
    title: String
    year: Int
    rating: Float
    # rank: Int
    director: StarType
    stars: [StarType]
  }
  type Query {
    users: [UserType]
    movies: [MovieType]
  }
`)

Для кода, который выпоказано, что ничего не требует специального распознавателя, за исключением того, что вы пытаетесь переименовать поле rating в rate.В graphql-js я считаю, что вам нужно предоставить фактический объект, который имеет действительные имена полей, которые вы хотите, и я обнаружил, что часто имеет смысл иметь отдельный набор объектов, которые непосредственно отражают API GraphQL, который вы хотите.

По моему опыту, если возможно использовать язык схемы GraphQL, вы должны сделать это: он гораздо более компактен и удобочитаем, чем объектное представление тех же типов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...