2017-02-20 2 views
0

Вот мой код из специального приложения для GraphQL схемы: -В графической схеме, как поле может быть GraphQLString, а также GraphQLInt?

let data = new GraphQLObjectType({ 
    name:"Data", 
    fields: { 
     id: {type: GraphQLID}, 
     value: {type: GraphQLString} // TODO: allow for string as well as int 
    } 
}); 

Как я могу сделать поле «значение» принимает значение строки, а также Int значения, так что она может быть сохранена с помощью правильного типа?

+0

ОК, если вы сделали значение 'integer', а также' string', то какой тип вы будете рассматривать для базы данных –

+0

@ p0k8_ Точка GraphQL должна скрывать данные базы данных. Не имеет значения, относится ли это значение к базе данных A или B или к некоторому файлу или другому API. Таким образом, вполне допустимо иметь типы объединения –

+0

graphql предоставляет 'int', но схема базы данных для типа' string' then ?? –

ответ

0

EDIT: Это решение не относится к вопросу. Он работает только для типов объектов и не скаляров

Вы должны смотреть на GraphQLUnionType: http://graphql.org/graphql-js/type/#graphqluniontype

Я не используется для определения типов, как это, но я ожидаю, что это будет что-то вроде ниже:

var ValueType = new GraphQLUnionType({ 
    name: 'Value', 
    types: [ GraphQLString, GraphQLInt ], 
    resolveType(value) { 
    if (value instanceof string) { 
     return GraphQLString; 
    } 
    if (value instanceof number) { 
     return GraphQLInt; 
    } 
    } 
}); 

let data = new GraphQLObjectType({ 
    name:"Data", 
    fields: { 
     id: {type: GraphQLID}, 
     value: {type: ValueType} 
    } 
}); 
+0

'UnionType' может иметь только типы объектов, он не может содержать тип типа' String' или 'Int' –

+0

. Я ошибся. Я пропустил нескалярную часть этого. Я вижу эту проблему в отношении использования: https://github.com/facebook/graphql/issues/215 –

+0

Я думаю, что этот ответ вводит в заблуждение, чтобы получить надпись, поскольку она не работает для этого случая. Я прошу, чтобы он был установлен как 0 снова. У меня еще недостаточно репутации, чтобы сделать это изменение. –

1

Согласно вашему комментарию, что вы используете базу данных NoSQL, которая может помещать как строки, так и ints в одно и то же поле, вы должны пойти с GraphQLString. При создании нового экземпляра вышеуказанного объекта вы можете создать метод resolve для поля value, который будет проверять, было ли переданное значение string или int (конечно, это всегда было бы строка из-за GraphQLString, однако это может быть строка типа "123", которая можно разобрать на int) - в соответствии с этим вы можете выполнить парсинг перед сохранением в базе данных. С другой стороны, когда вы будете извлекать данные из базы данных, он всегда будет отображаться как string в представлении graphql - если это не так, я думаю, что это может быть простым решением.

Однако, если вы не удовлетворены этим предложением, я боюсь, что вы не сможете обмануть GraphQL, как хотите. Каждое поле может получить только определение одного типа.

Смежные вопросы