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

У меня есть плагин, который создает объект с {id: "XXX", текст: "XXX"}, когда теги создаются пользователем. Я пытаюсь заставить мой сервер apollo graphql принимать этот объект как тип в моей схеме. Я перепробовал много вещей, но наиболее разумным для меня является создание типа с этой формой объекта и его использование. Это, кажется, работает в оригинальном типе, но не во входах (обновление и новый). Я получаю сообщение об ошибке: Ошибка: схема должна содержать уникальные именованные типы, но содержит несколько типов с именем "CustomQuestionOption".

const customQuestionTypeDefs = `
type CustomQuestionOption {
  id: ID,
  text: String
}

type CustomQuestion {
  id: ID!
  question: String
  questionType: String
  options: [CustomQuestionOption]
  required: Boolean
}

input UpdatedCustomQuestion {
  id: ID!
  question: String
  questionType: String
  options: [CustomQuestionOption]
  required: Boolean
}

input NewCustomQuestion {
  question: String
  questionType: String
  options: [CustomQuestionOption]
  required: Boolean
}

extend type Query {
  CustomQuestion(id: ID!): CustomQuestion!
  allCustomQuestions: [CustomQuestion]!
}

extend type Mutation {
  newCustomQuestion(input: NewCustomQuestion!): CustomQuestion!
  updateCustomQuestion(input: UpdatedCustomQuestion!): CustomQuestion!
}
`;

export default customQuestionTypeDefs;

который затем объединяется как

const baseSchema = `
  schema {
    query: Query
    mutation: Mutation
  }
`;

export const schema = makeExecutableSchema({
  typeDefs: [baseSchema, eventTypeDefs, sponsorshipItemTypeDefs, customQuestionTypeDefs, userTypeDefs],
  resolvers: merge({}, eventResolvers, sponsorshipItemResolvers, customQuestionResolvers, userResolvers)
});

Есть ли способ заставить мой сервер принимать этот объект во входах или мне нужно сохранить как строку и преобразовать его при сохранении и загрузке? (то есть "[{id: 'S', текст: 'S'}]")

1 ответ

Я думаю, что я пытался создать собственный скаляр (в отличие от встроенных скаляров, таких как string, int и т. Д.). Все, что мне нужно было сделать, - это изменить свой customQuestionOption на скаляр. РЕДАКТИРОВАТЬ - см. Ниже

const customQuestionTypeDefs = `
scalar CustomQuestionOption {
  id: String,
  text: String
}

type CustomQuestion {
  id: ID!
  question: String
  questionType: String
  options: [CustomQuestionOption]
  required: Boolean
}

input UpdatedCustomQuestion {
  id: ID!
  question: String
  questionType: String
  options: [CustomQuestionOption]
  required: Boolean
}

input NewCustomQuestion {
  question: String
  questionType: String
  options: [CustomQuestionOption]
  required: Boolean
}

extend type Query {
  CustomQuestion(id: ID!): CustomQuestion!
  allCustomQuestions: [CustomQuestion]!
}

extend type Mutation {
  newCustomQuestion(input: NewCustomQuestion!): CustomQuestion!
  updateCustomQuestion(input: UpdatedCustomQuestion!): CustomQuestion!
}
`;

export default customQuestionTypeDefs;

Это работало нормально, за исключением того, что отдельные свойства объекта не были доступны для запроса. Реальное решение состояло в том, чтобы превратить CustomQuestionOption обратно в тип для использования в запросе и создать другой ввод (я назвал его InputCustomQuestionOption) и использовать его для окончательных вводов:

const customQuestionTypeDefs = `
type CustomQuestionOption {
  id: String,
  text: String
}

input InputCustomQuestionOption {
  id: String,
  text: String
}

type CustomQuestion {
  id: ID!
  question: String
  questionType: String
  options: [CustomQuestionOption]
  required: Boolean
}

input UpdatedCustomQuestion {
  id: ID!
  question: String
  questionType: String
  options: [InputCustomQuestionOption]
  required: Boolean
}

input NewCustomQuestion {
  question: String
  questionType: String
  options: [InputCustomQuestionOption]
  required: Boolean
}
Другие вопросы по тегам