2017-02-20 2 views
0

여기 GraphQL 스키마에 대한 명시 응용 프로그램에서 내 코드입니다 : - 올바른 형식을 사용하여 저장 될 수 있도록 GraphQL 스키마에서 GraphQLInt는 물론 GraphQLString도 필드가 될 수 있습니까?

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

가 어떻게 value 필드가 int 값뿐만 아니라 문자열 값을 받아 들일 수 있는가?

+0

'integer'뿐만 아니라'string'을 만들었다면 어떤 유형의 데이터베이스를 고려할 것입니까? –

+0

@ p0k8_ GraphQL의 요점은 데이터베이스 세부 사항을 숨기는 것입니다. 이 값이 데이터베이스 A 또는 B 또는 일부 파일 또는 기타 API에서 오는 것인지는 중요하지 않습니다. 따라서 유니온 타입을 갖는 것은 완벽하게 유효합니다. –

+0

graphql이'int'를 제공하지만, 타입을위한 데이터베이스 스키마는'string'입니다. ?? –

답변

0

편집 : 이 해결책은 질문에 유효하지 않습니다. 나는이 같은 유형을 정의하는 데 사용하고 있지 않다 http://graphql.org/graphql-js/type/#graphqluniontype

,하지만 난 그것을 아래 같은 것으로 예상 : 그것은 당신이 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

나는이 경우에 작동하지 않기 때문에이 대답이 upvote를받는 것이 오도 된 것이라고 생각한다. 다시 0으로 설정되도록 요청합니다. 이 변화를 이루기에는 아직 충분한 평판이 없습니다. –

1

동일한 필드에 문자열과 int를 둘 수있는 NoSQL 데이터베이스를 사용한다는 의견에 따르면 GraphQLString으로 가야합니다. 위의 객체의 새 인스턴스를 만들 때 value 필드에 또는 int인지 확인하는 resolve 메서드를 만들 수 있습니다. 물론 GraphQLString 유형이기 때문에 항상 문자열이되지만, "123"과 같은 문자열이 될 수 있습니다. int로 구문 분석 될 수 있습니다) - 이것에 따라 당신은 데이터베이스에 저장하기 전에 일부 구문 분석을 수행 할 수 있습니다. 반면에 데이터베이스에서 데이터를 검색 할 때는 graphql 표현에서 항상 string으로 표시됩니다.이 경우가 아닌 경우 간단한 해결책이 될 수 있습니다.

그러나이 제안에 만족하지 않는다면 원하는대로 GraphQL을 속일 수는 없습니다. 모든 필드는 단일 유형 정의 만 얻을 수 있습니다.

관련 문제