반응형
GraphQL 스키마에서 맵 개체를 정의하는 가장 좋은 방법은 무엇입니까?
개체 배열로 키 문자열을 매핑하려고 합니다.
간단한 개체를 만들 수 있지만 이러한 배열에 개체를 쉽게 추가하고 싶습니다.맵 개체는 이 작업에 적합합니다.
문제:그래프에 대한 유형 맵을 정의하는 방법을 모르겠습니다.QL :'(
@ObjectType()
export class Inventaire
@Field()
_id: string;
@Field()
stocks: Map<string, Article[]>;
}
GraphQL은 기본적으로 지도 유형을 제공하지 않습니다.키-값 쌍의 JSON BLOB에는 강력한 스키마가 없으므로 다음과 같은 스키마를 사용할 수 없습니다.
{
key1: val1,
key2: val2,
key3: val3,
...
}
그러나 GraphQL 스키마를 정의하여 키 값 튜플 유형을 가진 다음 속성을 정의하여 해당 튜플의 배열을 반환할 수 있습니다.
type articleMapTuple {
key: String
value: Article
}
type Inventaire {
stocks: [articleMapTuple]
}
그러면 반환 유형은 다음과 같습니다.
data [
{
key: foo1,
value: { some Article Object}
},
{
key: foo2,
value: { some Article Object}
},
{
key: foo3,
value: { some Article Object}
},
]
이 패키지 https://www.npmjs.com/package/graphql-type-json 를 사용할 수 있습니다.
예:
import { makeExecutableSchema } from 'graphql-tools';
import GraphQLJSON, { GraphQLJSONObject } from 'graphql-type-json';
const typeDefs = `
scalar JSON
scalar JSONObject
type MyType {
myValue: JSON
myObject: JSONObject
}
# ...
`;
const resolvers = {
JSON: GraphQLJSON,
JSONObject: GraphQLJSONObject,
};
export default makeExecutableSchema({ typeDefs, resolvers });
GraphQL은 맵 유형을 기본적으로 지원하지 않습니다.맵에 대한 고유한 스칼라를 만들거나 repo https://github.com/graphql-java/graphql-java-extended-scalars 에 정의된 기존 ObjectScalar를 사용할 수 있습니다.
import graphql.Assert;
import graphql.language.ArrayValue;
import graphql.language.BooleanValue;
import graphql.language.EnumValue;
import graphql.language.FloatValue;
import graphql.language.IntValue;
import graphql.language.NullValue;
import graphql.language.ObjectValue;
import graphql.language.StringValue;
import graphql.language.Value;
import graphql.language.VariableReference;
import graphql.language.ObjectField;
import graphql.scalars.util.Kit;
import graphql.schema.Coercing;
import graphql.schema.CoercingParseLiteralException;
import graphql.schema.CoercingParseValueException;
import graphql.schema.CoercingSerializeException;
import graphql.schema.GraphQLScalarType;
import org.springframework.stereotype.Component;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Component
public class ObjectScalar extends GraphQLScalarType {
public ObjectScalar() {
this("Object", "An object scalar");
}
ObjectScalar(String name, String description) {
super(name, description, new Coercing<Object, Object>() {
public Object serialize(Object input) throws CoercingSerializeException {
return input;
}
public Object parseValue(Object input) throws CoercingParseValueException {
return input;
}
public Object parseLiteral(Object input) throws CoercingParseLiteralException {
return this.parseLiteral(input, Collections.emptyMap());
}
public Object parseLiteral(Object input, Map<String, Object> variables)
throws CoercingParseLiteralException {
if (!(input instanceof Value)) {
throw new CoercingParseLiteralException("Expected AST type 'StringValue' but" +
" was '" + Kit.typeName(input) + "'.");
} else if (input instanceof NullValue) {
return null;
} else if (input instanceof FloatValue) {
return ((FloatValue)input).getValue();
} else if (input instanceof StringValue) {
return ((StringValue)input).getValue();
} else if (input instanceof IntValue) {
return ((IntValue)input).getValue();
} else if (input instanceof BooleanValue) {
return ((BooleanValue)input).isValue();
} else if (input instanceof EnumValue) {
return ((EnumValue)input).getName();
} else if (input instanceof VariableReference) {
String varName = ((VariableReference)input).getName();
return variables.get(varName);
} else {
List values;
if (input instanceof ArrayValue) {
values = ((ArrayValue)input).getValues();
return values.stream().map((v) -> {
return this.parseLiteral(v, variables);
}).collect(Collectors.toList());
} else if (input instanceof ObjectValue) {
values = ((ObjectValue)input).getObjectFields();
Map<String, Object> parsedValues = new LinkedHashMap();
values.forEach((fld) -> {
Object parsedValue = this.parseLiteral(((ObjectField)fld).getValue(),
variables);
parsedValues.put(((ObjectField)fld).getName(), parsedValue);
});
return parsedValues;
} else {
return Assert.assertShouldNeverHappen("We have covered all Value types",
new Object[0]);
}
}
}
});
}
}
scalar Object
type Result {
value : Object
}
언급URL : https://stackoverflow.com/questions/56705157/best-way-to-define-a-map-object-in-graphql-schema
반응형
'programing' 카테고리의 다른 글
rgdal 패키지 설치 (0) | 2023.07.02 |
---|---|
Spring Boot 2.1 - Spring Security 자동 구성 없이 @WebMvcTest (0) | 2023.07.02 |
Oracle SQL 쿼리에서 선행 0을 추가하는 방법은 무엇입니까? (0) | 2023.07.02 |
mongodb 문서의 ID 유형으로 String을 사용할 수 있습니까? (0) | 2023.07.02 |
전자: jQuery가 정의되지 않았습니다. (0) | 2023.07.02 |