我們處於GraphQL Query的響應必須返回對象的某些動態屬性的情況。在我們的情況下,我們無法預先定義所有可能的屬性 - 所以它必須是動態的。帶有基於參數的動態字段的GraphQL ObjectType
正如我們認爲有兩個選擇來解決它。
const MyType = new GraphQLObjectType({
name: 'SomeType',
fields: {
name: {
type: GraphQLString,
},
elements: {
/*
THIS is our special field which needs to return a dynamic object
*/
},
// ...
},
});
正如您在示例代碼中看到的那樣,元素是必須返回對象的屬性。當解決這個可能是一個響應:
{
name: 'some name',
elements: {
an_unkonwn_key: {
some_nested_field: {
some_other: true,
},
},
another_unknown_prop: 'foo',
},
}
1)返回一個「任意對象」
我們只能返回任何對象 - 所以GraphQL不需要知道哪些字段的對象了。當我們告訴GraphQL該字段是GraphQlObjectType類型時,它需要定義字段。因此,似乎無法告訴GraphQL有人只是一個對象。
佛這一點,我們已經改變了它這樣的:
elements: {
type: new GraphQLObjectType({ name: 'elements' });
},
2)我們可以,因爲它在功能
定義動態字段屬性。當我們定義字段的功能,我們可以定義我們的對象動態。但是該字段函數需要一些信息(在我們的例子中將傳遞給元素的信息),我們需要訪問它們來構建字段對象。
例子:
const MyType = new GraphQLObjectType({
name: 'SomeType',
fields: {
name: {
type: GraphQLString,
},
elements: {
type: new GraphQLObjectType({
name: 'elements',
fields: (argsFromElements) => {
// here we can now access keys from "args"
const fields = {};
argsFromElements.keys.forEach((key) => {
// some logic here ..
fields[someGeneratedProperty] = someGeneratedGraphQLType;
});
return fields;
},
}),
args: {
keys: {
type: new GraphQLList(GraphQLString),
},
},
},
// ...
},
});
這可以工作,但如果要通過指定參數和/或解決對象的字段的方式問題將是。
問題 所以我們的問題現在是:哪種方式在我們的情況被推薦在GraphQL,是方案1或2可能嗎?也許還有另一種解決方案?
編輯 解決方案1在使用ScalarType時可以工作。示例:
type: new GraphQLScalarType({
name: 'elements',
serialize(value) {
return value;
},
}),
我不確定這是否是推薦的方式來解決我們的情況。
你的回答聽起來不錯。我們將在您的答案中嘗試定義的JSON類型。當然,如果我們僅僅返回「任何對象」而沒有可能控制其需要的數據,靈活性就會受到限制。但在我們的特殊情況下,我們沒有其他選擇,因爲屬性在我們的graphql服務器上是未知的。但是:這種情況在我們的邏輯中是非常特殊和獨特的。 – TJR
如何使用JSON.stringify()將任何json obj創建爲一個字符串,然後將該字符串賦予一個鍵,例如{any_data:'stringified json object'} –