是否可以指定GraphQL中的某個字段應該是黑匣子,類似於Flow的「any」類型?我在我的模式中有一個字段,應該能夠接受任意值,可以是字符串,布爾值,對象,數組等。GraphQL Blackbox /「任何」類型?
4
A
回答
3
是的。只需創建一個允許任何東西的新的GraphQLScalarType
。
這裏有一個我寫的允許對象。您可以擴展一下以允許更多的根類型。
import {GraphQLScalarType} from 'graphql';
import {Kind} from 'graphql/language';
import {log} from '../debug';
import Json5 from 'json5';
export default new GraphQLScalarType({
name: "Object",
description: "Represents an arbitrary object.",
parseValue: toObject,
serialize: toObject,
parseLiteral(ast) {
switch(ast.kind) {
case Kind.STRING:
return ast.value.charAt(0) === '{' ? Json5.parse(ast.value) : null;
case Kind.OBJECT:
return parseObject(ast);
}
return null;
}
});
function toObject(value) {
if(typeof value === 'object') {
return value;
}
if(typeof value === 'string' && value.charAt(0) === '{') {
return Json5.parse(value);
}
return null;
}
function parseObject(ast) {
const value = Object.create(null);
ast.fields.forEach((field) => {
value[field.name.value] = parseAst(field.value);
});
return value;
}
function parseAst(ast) {
switch (ast.kind) {
case Kind.STRING:
case Kind.BOOLEAN:
return ast.value;
case Kind.INT:
case Kind.FLOAT:
return parseFloat(ast.value);
case Kind.OBJECT:
return parseObject(ast);
case Kind.LIST:
return ast.values.map(parseAst);
default:
return null;
}
}
3
我想出了一箇中間的解決方案。我沒有試圖將這種複雜性推到GraphQL上,而是在將其設置在現場之前,只使用String
類型和JSON.stringify
數據。所以一切都被字符串化,後來在我的應用程序時,我需要消費這一領域,我JSON.parse
結果取回所需的對象/數組/布爾/等
0
@ MPEN的答案是偉大的,但我選擇了一個更緊湊的解決方案:
const { GraphQLScalarType } = require('graphql')
const { Kind } = require('graphql/language')
const ObjectScalarType = new GraphQLScalarType({
name: 'Object',
description: 'Arbitrary object',
parseValue: (value) => {
return typeof value === 'object' ? value
: typeof value === 'string' ? JSON.parse(value)
: null
},
serialize: (value) => {
return typeof value === 'object' ? value
: typeof value === 'string' ? JSON.parse(value)
: null
},
parseLiteral: (ast) => {
switch (ast.kind) {
case Kind.STRING: return JSON.parse(ast.value)
case Kind.OBJECT: throw new Error(`Not sure what to do with OBJECT for ObjectScalarType`)
default: return null
}
}
})
然後,我的解析器是這樣的:
{
Object: ObjectScalarType,
RootQuery: ...
RootMutation: ...
}
而且我.gql
樣子:
scalar Object
type Foo {
id: ID!
values: Object!
}
相關問題
- 1. GraphQL類型組合
- 2. GraphQL到PostgresQL類型映射
- 3. GraphQL isomorfic模型
- 4. GraphQL排序自定義類型
- 5. graphql Java的循環類型的依賴
- 6. GraphQL聯合和輸入類型?
- 7. GraphQL文本類型無效的參數
- 8. 類型循環參考問題graphql
- 9. Whitebox和Blackbox測試
- 10. Blackbox性能測試Snort
- 11. Arquillian for Blackbox硒檢測
- 12. graphql-JS查詢可以以任意順序,但顯然輸入類型不能
- 13. 如何使用union類型的接口,在graphql
- 14. 如何使用ReactJS從GraphQL的枚舉類型列出成員
- 15. 如何用ruby-graphql指定多態類型?
- 16. GraphQL:如何查詢所有可用的類型?
- 17. 類型交點任何
- 18. `purrr :: map`任何類型
- 19. Haskell中的任何類型?
- 20. 恢復任何類型
- 21. 返回任何類型的
- 22. 任何數字類型BigDecimal
- 23. bencode Scala任何類型
- 24. 如何jsdoc類型標記任何類類型提示
- 25. DefinitelyTyped爲graphql
- 26. django ForeignKey任何類型的模型
- 27. 任何類型的Java泛型<?>
- 28. GraphQL與Keystone希望字段類型必須是輸出類型,但得到:undefined
- 29. 我可以在GraphQL中使用沒有連接類型的邊緣類型嗎?
- 30. Graphql的日期字段類型必須是輸出類型,但得到:undefined