Kann man angeben, dass ein Feld in GraphQL eine Blackbox sein soll, ähnlich wie Flow einen "Any" -Typ hat? Ich habe ein Feld in meinem Schema, das in der Lage sein sollte, jeden beliebigen Wert zu akzeptieren, der ein String, Boolean, Object, Array usw. sein könnte.GraphQL Blackbox/"Any" -Typ?
4
A
Antwort
3
Ja. Erstellen Sie einfach einen neuen GraphQLScalarType
, der alles erlaubt.
Hier ist ein Ich schrieb, dass Objekte erlaubt. Sie können es etwas erweitern, um mehr Root-Typen zuzulassen.
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
Ich habe eine mittlere Lösung gefunden. Statt zu versuchen, diese Komplexität auf GraphQL zu übertragen, verwende ich einfach die Daten String
und JSON.stringify
meine Daten, bevor Sie sie auf dem Feld einstellen. Also wird alles stringifiziert, und später in meiner Anwendung, wenn ich dieses Feld konsumieren muss, JSON.parse
das Ergebnis, um das gewünschte Objekt/Array/Boolean/etc. zurück zu bekommen
0
@ mpens Antwort ist großartig, aber ich entschied mich für eine kompaktere Lösung:
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
}
}
})
Dann sieht mein Resolvern wie:
{
Object: ObjectScalarType,
RootQuery: ...
RootMutation: ...
}
Und mein .gql
wie folgt aussieht:
scalar Object
type Foo {
id: ID!
values: Object!
}
Verwandte Themen
- 1. GraphQL Typ Zusammensetzung
- 2. GraphQL zu PostgresQL Typ Mapping
- 3. Typ zirkuläre Referenz Ausgabe graphql
- 4. graphQL - Typ muss Ausgabetyp sein
- 5. Warum wählt GraphQL den Typ 'Eingabe'?
- 6. Wie rekursiv GraphQL Typ programmgesteuert definieren?
- 7. Was Graphql Typ wird für Telefonnummern sein
- 8. Ist GraphQL gültig für GraphQL +?
- 9. warum graphql-Rubys boolean Typ nicht false zurück auf Nullwert
- 10. Zuweisen von JSON in einem GraphQL-Typ in Nodejs
- 11. GraphQL Fehlerfeldtyp muss Eingang Typ sein, aber bekam:
- 12. Graphql Rubin, wie Interface-Typ erstellen und implementieren es
- 13. GraphQL/Relay-Schema-Feld kann nicht "speichern" auf Typ "CreateLinkPayload"
- 14. GraphQL: Wiederverwendung von Argumenten von root_query in einem Typ
- 15. Verwendung von Graphql-Type-Json-Paket mit GraphQl
- 16. GraphQL: Wie Paginierung mit GraphQL-Java implementieren?
- 17. graphql-tester (Komponententests) mit Graphql Apollo Server
- 18. graphql Fehler und Statusmeldungen in graphql-js
- 19. GraphQL erhalten einen Benutzer mit GraphQL-Tools
- 20. GraphQL - Syntaxfehler GraphQL Anfrage (5,15) erwartete Name
- 21. GraphQL __InputValue und „mit der GraphQL Sprache“
- 22. GraphQL - Spread Eingabe Args
- 23. GraphQL Args Fehler: Argument Typ muss Eingang Typ sein, aber bekam: function GraphQLObjectType (config) {
- 24. Apollo/GraphQL: Feldtyp für Zeitstempel?
- 25. GraphQL Validierungsfehler
- 26. Graphql Architektur
- 27. GraphQL-Mutationsvariablen
- 28. Relation GraphQL
- 29. Return Graphql
- 30. Verschachtelung Fragmente in graphql