Запрос Graphql возвращает null для реляционного документа, поле отсутствует в запросе, но присутствует в админке primsa

Когда я просматриваю документ в prisma admin, я вижу поле location, но когда я запускаю запросы к этой базе данных, значения всегда равны нулю во внешнем интерфейсе и вообще не возвращаются преобразователем.

Я просмотрел Почему запрос GraphQL возвращает значение null?, но ни одного из этих случаев совпадают с коренной проблемой или говорят о ней, насколько я могу судить.

Я пытался разобраться в этой статье, но не смог реализовать так, чтобы я мог составить запрос, который действительно срабатывает: https://www.prisma.io/tutorials/a-guide-to-common-resolver-patterns-ct08/

Настройка соответствует расширенному курсу реагирования Web Bos и выглядит так:

Создать приложение React -> Apollo-client -> Yoga server -> Prisma Server (sql)

Я ходил туда и сюда, используя типы ввода, упрощая преобразователи до минимума, запрашивая только один документ, а не массив документов. Варианты, которые я бы предпочел не использовать, - это использование скалярного типа Json и пропуск вложенной структуры в пользу плоской структуры.

Внешний интерфейс:

const CREATE_MISSION = gql`
  mutation CREATE_MISSION($title: String!, $description: String!, $bounty: Int!, $image: String, $postedBy: String!, $location: LocationInput) {
    createMission(title: $title, description: $description, bounty: $bounty, image: $image, postedBy: $postedBy, location: $location) {
      id
      title
      bounty
      image
      description
      postedBy
      location {
        id
        lat
        lng
      }
    }
  }
`;

schema.graphql:

input LocationInput {
  lat: Float!
  lng: Float!
}

type Mutation {
  createMission(
    title: String!,
    description: String!,
    bounty: Int!,
    image: String,
    postedBy: String!,
    location: LocationInput
  ): Mission!
}

datamodel.graphql:

type Location {
  id: ID! @id
  lat: Float!
  lng: Float!
}

type Mission {
  id: ID! @id
  title: String!
  description: String!
  bounty: Int!
  image: String
  postedBy: String!
  location: Location @relation(name: "MissionStart")
  end: Location @relation(name: "MissionEnd")
  dispatcher: User @relation(name: "Dispatcher")
  activeUser: User @relation(name: "Active")
  appliedUsers: [User] @relation(name: "Applicants")
}

Mutations.js

  async createMission (parent, args, ctx, info) {
    console.log(`Create Mission server side`)
    // let { input } = args
    console.dir(args)
    const mission = await ctx.db.mutation.createMission({
      data: {
        ...args,
        dispatcher: {
          connect: {
            id: args.postedBy
          },
        },
        location: {
          create: {
            lat: args.location.lat,
            lng: args.location.lng
          }
        }
      },
    }, info);
    return mission
  },

Запрос игровой площадки:

{
  mission (id:"someid") {
    title
    description
    location {
      lat
    }
  }
  location(id:"id_asPerTheDB ") {
    lat
  }
}

возвращает:

{
  "data": {
    "mission": {
      "title": "Take me the airport",
      "description": "so I can fly",
      "location": null
    },
    "location": {
      "lat": 30.2255867
    }
  }
}

Согласно возвращаемому значению на игровой площадке, я не могу получить это местоположение из базы данных с помощью простого вложенного запроса. Я пробовал использовать следующий преобразователь (запрос на бэкэнде), но у него всегда null для m.location

async missions (parent, args, ctx, info) {
    const missions = await ctx.db.query.missions()
    return Promise.all(missions.map(async m => {
      if (m.location) {
        const location = await ctx.db.query.location({where: { id: m.location.id }})
        return Object.assign(m, { location })
      } else return m
    }));
  },

и все же от администратора prisma:  скриншот администратора prisma


person alphanumeric0101    schedule 19.08.2019    source источник
comment
Где определение типа Mission в вашем schema.graphql?   -  person    schedule 20.08.2019
comment
@JayCodist Я не помещал определение миссии в этот файл напрямую, но вверху у меня есть оператор импорта, подобный этому # import * from './generated/prisma.graphql' это сгенерированная схема из datamodel.graphql, которая отправляется из prisma deploy   -  person alphanumeric0101    schedule 20.08.2019


Ответы (1)


Вау, нереально, поэтому единственное, что мне нужно было сделать, это передать info в Query ...

async missions (parent, args, ctx, info) {
    const missions = await ctx.db.query.missions({}, info)
    return missions
  }

Все данные, которые я хочу, теперь передаются клиенту, информация, по-видимому, содержит детали, необходимые для обработки отношений, милорд! 2 дня спустя лол.

person alphanumeric0101    schedule 20.08.2019