Проблема с использованием универсального объекта в качестве типа ввода в схеме 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
}