Как использовать массивы типов схем для GraphQL - PullRequest
0 голосов
/ 13 февраля 2019

Попробуем GraphQL впервые, и я бы хотел, чтобы один тип схемы имел доступ к массиву объектов в другом типе схемы.Я использую локальные данные и lodash, чтобы проверить это, прежде чем подключить его к MongoDB.Я получаю несколько ошибок относительно моих попыток сделать это.Я знаю, что я рядом.Любая помощь будет оценена.

Следующее было моей последней попыткой.Я получил доступ к GraphQLList с помощью express-graphql и использовал GraphQLID для доступа ко второй схеме.

schema.js

var projects = [
{
    name: "Title 1",
    subtitle: "Subtitle 1",
    summary: "Lorem ipsum....",
    languageId: ["4", "2"],
    id: "1"
},
...

var languages = [
{ name: "Javascript", id: "1" },
{ name: "HTML", id: "2" },
{ name: "CSS", id: "3" },
{ name: "Python", id: "4" },
]
...

const ProjectType = new GraphQLObjectType({
name: 'Project',
fields: () => ({
    id: { type: GraphQLID },
    name: { type: GraphQLString },
    subtitle: { type: GraphQLString },
    summary: { type: GraphQLString },
    languages: {
        type: new GraphQLList(GraphQLID),
        resolve(parent, args) {
            console.log(parent)
            return _.find(languages, { id: parent.languageId })
        }
    }
})
});

const LanguageType = new GraphQLObjectType({
name: 'Language',
fields: () => ({
    id: { type: GraphQLID },
    name: { type: GraphQLString },
     })
});

//Root Queries
const RootQuery = new GraphQLObjectType({
name: 'RootQueryType',
fields: {
    project: {
        type: ProjectType,
        args: { id: { type: GraphQLID } },
        resolve(parent, args) {

           return _.find(projects, { id: args.id });
        }
    },
    language: {
        type: LanguageType,
        args: { id: { type: GraphQLID } },
        resolve(parent, args) {

            return _.find(languages, { id: args.id })
          }
        }
    }
});

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

    {
    "data": {
    "project": {
      "name": "Project 1"
      languages{
          names{
             "Python"
             "HTML" 
              }
            }
         }
        }
       }

Вместо этого я получаю следующее ...

    {
  "errors": [
    {
      "message": "Syntax Error: Expected Name, found }",
      "locations": [
        {
          "line": 7,
          "column": 7
        }
      ]
    }
  ]
}

Я переформатировал решение в hardзакодировать массив языков, и это работает, но это не работает.Любые предложения будут ценны.Спасибо всем за ваше время.

1 Ответ

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

Я не уверен, какой запрос вы пытаетесь сделать.Но для возврата Languages, вложенного в Projects, необходимо изменить тип возврата поля languages.

Что-то вроде:

const ProjectType = new GraphQLObjectType({
    name: 'Project',
    fields: () => ({
        id: {type: GraphQLID},
        name: {type: GraphQLString},
        subtitle: {type: GraphQLString},
        summary: {type: GraphQLString},
        languages: {

            // change this type to LanguageType
            type: new GraphQLList(LanguageType),
            resolve(parent, args) {
                // No need to lodash here
                return languages.filter((language) => {
                    return  parent.languageId.includes(language.id)
                })
            }
        }
    })
});
...