Я вызываю API отчетов с помощью Nodejs, который дает мне ответ JSON. Апи можно вызвать с другим идентификатором (в данном случае с другим идентификатором отчета). Например:
https://report.domain.io/report/1
https://report.domain.io/report/2
и так далее. Поскольку идентификатор отличается в разное время, он даст мне разные ответы. Имя атрибута будет другим. Поэтому я не могу сопоставить его в GraphQLObjectType. Например, если ответ JSON следующий:
[
{
"modelbrand": "Sony",
"modelcode": "F3111",
"avg_free_storage": 225401514
},
{
"modelbrand": "Sony",
"modelcode": "F3111",
"avg_free_storage": 224547840
}
]
Тогда я могу сопоставить его с GraphQL следующим образом:
Report() {
return new graphql.GraphQLObjectType({
name: "Report",
description: "This represents report",
fields: () => ({
"modelbrand": {type: graphql.GraphQLString},
"modelcode": {type: graphql.GraphQLString},
"avg_free_storage": {type: graphql.GraphQLString}
})
});
}
потому что я знаю, что атрибуты исправлены. Но если имя атрибута /s, например modelbrand, код модели изменяется на что-то другое (очевидно, что это будет отличаться для разных отчетов), тогда я не могу сопоставить его в GraphQLObjectType. В этом случае мне нужен другой тип (который должен быть JSON-типом) для сопоставления этих ответов. К сожалению, он недоступен как примитивный тип для GraphQL. Я не нахожу какой-либо пользовательский/скалярный тип или библиотеку узлов для решения этой проблемы. В переполнении стека есть решение, но похоже, что оно не работает.
Могу ли я получить решение для этого? Будет оценен пример Nodejs. Благодарю.
Пожалуйста, обратитесь к этому graphql-type-json. Это можно использовать как пользовательский скалярный тип json.
В файле схемы
scalar JSON
type User {
id: ID!
userDetails: JSON
}
type Query {
getUser(id: ID!): User
}
В файле resolver
import GraphQLJSON from 'graphql-type-json';
import {User} from './connectors';
const resolvers = {
Query: getUser(_, args) {
return User.find({
where: args
});
},
JSON: {
__serialize(value) {
return GraphQLJSON.parseValue(value);
}
}
}
Это может помочь вам