GraphQL не может разрешить схему при мутации - PullRequest
0 голосов
/ 16 июня 2020

У меня две схемы:

var Player = new graphql.GraphQLObjectType({
  name: 'Player',
  fields: () => ({
    id: { type: graphql.GraphQLString },
    first_name: { type: graphql.GraphQLString },
    last_name: { type: graphql.GraphQLString },
    team: {
      type: Team,
      sqlJoin: (playerTable, teamTable, args) => `${playerTable}.team_id = ${teamTable}.id`
    }
  })
});

Player._typeConfig = {
  sqlTable: 'player',
  uniqueKey: 'id',
}

и

var Team = new graphql.GraphQLObjectType({
  name: 'Team',
  fields: () => ({
    id: { type: graphql.GraphQLInt },
    name: { type: graphql.GraphQLString },
  })
})
Team._typeConfig = {
  sqlTable: 'team',
  uniqueKey: 'id'
}

У меня также есть 1 мутация и 1 запрос:

// Mutation
const MutationRoot = new graphql.GraphQLObjectType({
  name: 'Mutation',
  fields: () => ({
    player: {
      type: Player,
      args: {
        first_name: { type: graphql.GraphQLNonNull(graphql.GraphQLString) },
        last_name: { type: graphql.GraphQLNonNull(graphql.GraphQLString) },
        team_id: { type: graphql.GraphQLNonNull(graphql.GraphQLInt) },
      },
      resolve: (root, args) => {
          return client.query("INSERT INTO player (first_name, last_name, team_id) VALUES ($1, $2, $3) RETURNING *", [args.first_name, args.last_name, args.team_id]).then(result=>{
            console.log(result);
            return result.rows[0];
          })
      }
    }
  })
})

и

// Query
const QueryRoot = new graphql.GraphQLObjectType({
  name: 'Query',
  fields: () => ({
  player: {
      type: Player,
      args: { id: { type: graphql.GraphQLNonNull(graphql.GraphQLInt) } },
      where: (playerTable, args, context) => `${playerTable}.id = ${args.id}`,
      resolve: (parent, args, context, resolveInfo) => {
        return joinMonster.default(resolveInfo, {}, sql => {
          return client.query(sql)
        })
      }
    }
})

В основном приложение может вставлять игрока и идентификатор команды, к которой он / она принадлежит.

При выполнении мутации (вставке записи) запись успешно добавляется, и я могу запросить правильные данные. Проблема заключается в том, что при вставке игрока и при запросе информации о команде GraphQL возвращает нулевое значение для команды.

mutation{
  player(first_name:"Kobe", last_name:"Bryant", team_id:1) {
    id
    last_name
    first_name
    team{
      id
      name
    }
  }
}

Возвращает:

{
  "data": {
    "player": {
      "id": "70",
      "last_name": "Bryant",
      "first_name": "Kobe",
      "team": null
    }
  }
}

Однако при запросе игрока с идентификатором "70" информация о команде была успешно решена:

query{
  player(id:70) {
    id
    team{
      id
      name
    }
  }
}

Возвращает:

{
  "data": {
    "player": {
      "id": "70",
      "team": {
        "id": 1,
        "name": "Los Angeles Lakers"
      }
    }
  }
}

Есть идеи, что мне здесь не хватает?

Извините, если мое объяснение немного сбивает с толку, так как я все еще изучаю основы GraphQL. Большое спасибо!

1 Ответ

1 голос
/ 16 июня 2020

Похоже, вы используете не простой GraphQL. js, а какую-то дополнительную библиотеку / фреймворк, которая создает SQL запросов для вас. Это не стандарт, и обычно поля используют преобразователи для получения дополнительных данных.

Если вы запустите запрос, который работает, эта структура волшебным образом создаст для вас аналогичный запрос, подобный этому запросу, благодаря аннотациям, которые вы сделали в GraphQL введите config:

SELECT id, team.id as team_id, team.name as team_name
FROM player
JOIN team ON player.team_id = team.id
WHERE player.id = 70

Обратите внимание, как он автоматически добавляет JOIN -statement. Но в своей мутации вы решили написать запрос вручную и напрямую отправить его в базу данных. Ваша структура не может вам помочь и вставьте соединение. Запрос к базе данных вернет только поля игроков без полей команд.

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