рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдЖрд▓реЗрдЦ рдЙрди рдкрд╛рдардХреЛрдВ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЧреНрд░рд╛рдлрд╝рдХреЙрдХ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЬрдЯрд┐рд▓рддрд╛рдУрдВ рдФрд░ рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирддреЗ рд╣реИрдВред рдлрд┐рд░ рднреА, рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╢реБрд░реБрдЖрддреА рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред
GraphQL рдПрдХ рдорд╣рд╛рди рдЙрдкрдХрд░рдг рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрдИ рд▓реЛрдЧ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕рдХреЗ рдлрд╛рдпрджреЗ рдЬрд╛рдирддреЗ рдФрд░ рд╕рдордЭрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЖрдкрдХреЗ рдЧреНрд░рд╛рдлрдХреЙрд▓ рдЖрдзрд╛рд░рд┐рдд рдПрдкреАрдЖрдИ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╕рдордп рдХреБрдЫ рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЧреНрд░рд╛рдлрдХрд▓рд╛рдЗрди рдЖрдкрдХреЛ рдЙрдкрднреЛрдХреНрддрд╛ (рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдпрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо) рдХреЛ рдбреЗрдЯрд╛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдХреЗрд╡рд▓ рд╡рд╣ рд╣рд┐рд╕реНрд╕рд╛ рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рдЙрдкрднреЛрдХреНрддрд╛ рд░реБрдЪрд┐ рд░рдЦрддрд╛ рд╣реИред рдлрд┐рд░ рднреА, рдПрдХ рд╕рд░реНрд╡рд░ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╕рдордп рдЧрд▓рддреА рдХрд░рдирд╛ рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реИ, рдЬреЛ рдЗрд╕ рддрдереНрдп рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╕рд░реНрд╡рд░ рдХреЗ рдЕрдВрджрд░ (рдЬреЛ рдЕрдиреНрдп рдЪреАрдЬреЛрдВ рдХреЗ рдмреАрдЪ, рд╡рд┐рддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ), рдбреЗрдЯрд╛ рдкреВрд░реНрдг "рдмрдВрдбрд▓реЛрдВ" рдореЗрдВ рдЪрд▓реЗрдЧрд╛ред рдпрд╣ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рдЧреНрд░рд╛рдлрдХреНрд▓рд╛рдЗрди рдЦреБрдж рдПрдХ рдЖрдиреЗ рд╡рд╛рд▓реА рдХреНрд╡реЗрд░реА рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЙрдкрдХрд░рдг рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЬреЛ рдЗрдВрдЯрд░рдлреЗрд╕ рдЗрд╕рдореЗрдВ рд░рдЦреЗ рдЧрдП рд╣реИрдВ рд╡реЗ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкреНрд░рд▓реЗрдЦрд┐рдд рдирд╣реАрдВ рд╣реИрдВред
рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕реНрд░реЛрдд
рдЖрдЗрдП рдПрдХ рдЧреИрд░-рдЗрд╖реНрдЯрддрдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рдХреЛ рджреЗрдЦреЗрдВ (рдпрджрд┐ рдпрд╣ рдЦрд░рд╛рдм рдкрдврд╝рд╛ рд╣реИ рддреЛ рдПрдХ рдЕрд▓рдЧ рд╡рд┐рдВрдбреЛ рдореЗрдВ рдЪрд┐рддреНрд░ рдЦреЛрд▓реЗрдВ):

рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░рд╛ рдЙрдкрднреЛрдХреНрддрд╛ "рдлреЛрди рдмреБрдХ" рдХрд╛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдпрд╛ рдШрдЯрдХ рд╣реИ рдЬреЛ рд╣рдорд╛рд░реЗ рдПрдкреАрдЖрдИ рд╕реЗ рдХреЗрд╡рд▓ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛, рдирд╛рдо рдФрд░ рдлреЛрди рдирдВрдмрд░ рдкреВрдЫрддрд╛ рд╣реИред рдЙрд╕реА рд╕рдордп, рд╣рдорд╛рд░рд╛ рдПрдкреАрдЖрдИ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╡реНрдпрд╛рдкрдХ рд╣реИ, рдпрд╣ рдЕрдиреНрдп рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдВрдЪ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛, рдЬреИрд╕реЗ рдХрд┐ рдирд┐рд╡рд╛рд╕ рдХрд╛ рднреМрддрд┐рдХ рдкрддрд╛ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХрд╛ рдИрдореЗрд▓ рдкрддрд╛ред
рдЙрдкрднреЛрдХреНрддрд╛ рдФрд░ рдПрдкреАрдЖрдИ рдХреЗ рдмреАрдЪ рдбреЗрдЯрд╛ рд╡рд┐рдирд┐рдордп рдХреЗ рдмрд┐рдВрджреБ рдкрд░, рдЧреНрд░рд╛рдлрдХрд▓рд╛рдЗрди рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ - рдХреЗрд╡рд▓ рдЕрдиреБрд░реЛрдз рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдХреЛ рдЕрдиреБрд░реЛрдз рдХреЗ рдЬрд╡рд╛рдм рдореЗрдВ рднреЗрдЬрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдбреЗрдЯрд╛ рдХреЗ рдирдореВрдиреЗ рдХреЗ рдмрд┐рдВрджреБ рдкрд░ рд╣реИ - рдЕрд░реНрдерд╛рддреНред рд╣рдорд╛рд░реЗ рд╕рд░реНрд╡рд░ рдХреЗ рдЖрдВрддрд░рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рдФрд░ рдпрд╣ рдЗрд╕ рддрдереНрдп рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рд╣рдо рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рд╕рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛ рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рд╣рдореЗрдВ рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдбреЗрдЯрд╛рдмреЗрд╕ рдкрд░ рдЕрддреНрдпрдзрд┐рдХ рднрд╛рд░ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рднреАрддрд░ рдЕрддреНрдпрдзрд┐рдХ рдпрд╛рддрд╛рдпрд╛рдд рдХреЗ рд╕рдВрдЪрд▓рди рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИред рдкреНрд░рд╢реНрдиреЛрдВ рдХреА рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде, рдЖрдк рдбреЗрдЯрд╛ рдирдореВрдиреЗ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдмрджрд▓рдХрд░ рдФрд░ рдХреЗрд╡рд▓ рдЙрди рдлрд╝реАрд▓реНрдбреНрд╕ рдХрд╛ рдЪрдпрди рдХрд░рдХреЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдиреБрдХреВрд▓рди рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЕрдиреБрд░реЛрдз рдХрд┐рдП рдЧрдП рдереЗред рдЙрд╕реА рд╕рдордп, рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдорд╛рдпрдиреЗ рдирд╣реАрдВ рд░рдЦрддрд╛ рдХрд┐ рд╣рдорд╛рд░реЗ рдбреЗрдЯрд╛ рдХрд╛ рд╕реНрд░реЛрдд рдХреНрдпрд╛ рд╣реИ - рдПрдХ рд░рд┐рд▓реЗрд╢рдирд▓ рдбреЗрдЯрд╛рдмреЗрд╕, NoSQL рддрдХрдиреАрдХ рдпрд╛ рдХреЛрдИ рдЕрдиреНрдп рд╕реЗрд╡рд╛ (рдЖрдВрддрд░рд┐рдХ рдпрд╛ рдмрд╛рд╣рд░реА)ред рдХреЛрдИ рднреА рдЧреИрд░-рдЗрд╖реНрдЯрддрдо рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд┐рд╕реА рднреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ MySQL рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдЪреБрдирд╛ рдЧрдпрд╛ рд╣реИред
рдирд┐рд░реНрдгрдп
рдпрджрд┐ рд╣рдо resolve()
рдЖрдиреЗ рд╡рд╛рд▓реЗ рддрд░реНрдХреЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕ рд╕рд░реНрд╡рд░ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ:
async resolve(source, args, context, info) {
рдпрд╣ рдЕрдВрддрд┐рдо рддрд░реНрдХ, info
, рдЬреЛ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд░реБрдЪрд┐ рд╣реИред рд╣рдо рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХреА рдУрд░ рдореБрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ resolve()
рдлрд╝рдВрдХреНрд╢рди рдФрд░ рддрд░реНрдХ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ:
type GraphQLFieldResolveFn = ( source?: any, args?: {[argName: string]: any}, context?: any, info?: GraphQLResolveInfo ) => any type GraphQLResolveInfo = { fieldName: string, fieldNodes: Array<Field>, returnType: GraphQLOutputType, parentType: GraphQLCompositeType, schema: GraphQLSchema, fragments: { [fragmentName: string]: FragmentDefinition }, rootValue: any, operation: OperationDefinition, variableValues: { [variableName: string]: any }, }
рдЗрд╕рд▓рд┐рдП, рд░рд┐рд╕реЙрд▓реНрд╡рд░ рдХреЛ рджрд┐рдП рдЧрдП рдкрд╣рд▓реЗ рддреАрди рддрд░реНрдХ source
- рд╕реНрдХреАрдорд╛ рдХреЗ рдЧреНрд░рд╛рдлрдХреНрдпреВрд╕реА рдкреЗрдбрд╝ рдореЗрдВ рдореВрд▓ рдиреЛрдб рд╕реЗ рдкрд╛рд░рд┐рдд рдбреЗрдЯрд╛, рдЖрд░реНрдЧреНрд╕ - рдХреНрд╡реЗрд░реА рддрд░реНрдХ (рдЬреЛ рдХреНрд╡реЗрд░реА рд╕реЗ рдЖрддреЗ рд╣реИрдВ), рдФрд░ context
- рдбреЗрд╡рд▓рдкрд░ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд┐рд╖реНрдкрд╛рджрди рд╕рдВрджрд░реНрдн рдСрдмреНрдЬреЗрдХреНрдЯ, рдЬрд┐рд╕реЗ рдЕрдХреНрд╕рд░ рдХреБрдЫ рд╡реИрд╢реНрд╡рд┐рдХ рдбреЗрдЯрд╛ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдореЗрдВ "рд░рд┐рд╕реЙрд▓реНрд╡рд░ред" рдФрд░ рдЕрдВрдд рдореЗрдВ, рдЪреМрдерд╛ рддрд░реНрдХ рдЕрдиреБрд░реЛрдз рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореЗрдЯрд╛ рдЬрд╛рдирдХрд╛рд░реА рд╣реИред
рд╣рдо рдЕрдкрдиреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП GraphQLResolveInfo
рд╕реЗ рдХреНрдпрд╛ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ?
рдЗрд╕рдХреЗ рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рд╣рд┐рд╕реНрд╕реЗ рд╣реИрдВ:
fieldName
рдЙрдирдХреЗ GraphQL рд╕реНрдХреАрдорд╛ рдХрд╛ рд╡рд░реНрддрдорд╛рди рдлрд╝реАрд▓реНрдб рдирд╛рдо рд╣реИред рдпрд╛рдиреА рдпрд╣ рдЗрд╕ рд░рд┐рдЬреЙрд▓реНрд╡рд░ рдХреЗ рд▓рд┐рдП рд╕реНрдХреАрдорд╛ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдлрд╝реАрд▓реНрдб рдирд╛рдо рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИред рдпрджрд┐ рд╣рдо users
рдХреНрд╖реЗрддреНрд░ рдкрд░ info
рд╡рд╕реНрддреБ рдХреЛ рдкрдХрдбрд╝рддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╣реИ, рддреЛ рдпрд╣ "рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛" рд╣реИ рдЬреЛ рдХрд┐ fieldName
рдХреЗ рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ fieldName
fieldNodes
- рдЙрди рдиреЛрдбреНрд╕ рдХрд╛ рд╕рдВрдЧреНрд░рд╣ (рд╕рд░рдгреА) рдЬреЛ рдХреНрд╡реЗрд░реА рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдереЗред рдмрд╕ рдХреНрдпрд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ!fragments
- рдЕрдиреБрд░реЛрдз рдХреЗ рдЯреБрдХрдбрд╝реЗ рдХрд╛ рдПрдХ рд╕рдВрдЧреНрд░рд╣ (рдорд╛рдорд▓реЗ рдореЗрдВ рдЕрдиреБрд░реЛрдз рдЦрдВрдбрд┐рдд рдерд╛)ред рдЕрдВрддрд┐рдо рдбреЗрдЯрд╛ рдлрд╝реАрд▓реНрдб рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЬрд╛рдирдХрд╛рд░реАред
рдЗрд╕рд▓рд┐рдП, рд╕рдорд╛рдзрд╛рди рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдореЗрдВ info
рдЯреВрд▓ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдХреНрд╡реЗрд░реА рд╕реЗ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЖрдП рдлрд╝реАрд▓реНрдб рдХреА рд╕реВрдЪреА рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ, рдФрд░ рдлрд┐рд░ рдЙрдиреНрд╣реЗрдВ SQL рдХреНрд╡реЗрд░реА рдореЗрдВ рдкрд╛рд╕ рдХрд░реЗрдВред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдлреЗрд╕рдмреБрдХ рд╕реЗ "рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░" рдЧреНрд░рд╛рдлрдХреНрдпреВрдПрд▓ рдкреИрдХреЗрдЬ рд╣рдореЗрдВ рдЗрд╕ рдХрд╛рд░реНрдп рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░, рдЬреИрд╕рд╛ рдХрд┐ рдЕрднреНрдпрд╛рд╕ рд╕реЗ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ, рдпрд╣ рдХрд╛рд░реНрдп рдЗрддрдирд╛ рддреБрдЪреНрдЫ рдирд╣реАрдВ рд╣реИ, рдЗрд╕ рддрдереНрдп рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдЦрдВрдбрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдФрд░ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рддрд░рд╣ рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд╛ рдПрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╕рдорд╛рдзрд╛рди рд╣реИ, рдЬрд┐рд╕реЗ рдмрд╛рдж рдореЗрдВ рдХреЗрд╡рд▓ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдХреЙрдкреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕реЗ ISC рд▓рд╛рдЗрд╕реЗрдВрд╕ рдХреЗ рддрд╣рдд рдПрдХ рдУрдкрди рд╕реЛрд░реНрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдЗрд╕рдХреА рдорджрдж рд╕реЗ, рдЖрдиреЗ рд╡рд╛рд▓реЗ рдХреНрд╡реЗрд░реА рдлрд╝реАрд▓реНрдб рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд╛рдлреА рд╕рд░рд▓ рд░реВрдк рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ:
const { fieldsList } = require('graphql-fields-list');
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ fieldsList(info)
рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╕рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рд░рд┐рдЬрд╝реЙрд▓реНрд╡рд░ рдХреЗ рд▓рд┐рдП рдмрд╛рд▓ рдлрд╝реАрд▓реНрдб рдХрд╛ "рдлреНрд▓реИрдЯ" рд╕рд░рдгреА рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреНред рд╣рдорд╛рд░реА рдЕрдВрддрд┐рдо SQL рдХреНрд╡реЗрд░реА рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА:
SELECT id, name, phone FROM users;
рдпрджрд┐ рд╣рдо рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреБрд░реЛрдз рдХреЛ рдЗрд╕рдореЗрдВ рдмрджрд▓рддреЗ рд╣реИрдВ:
query UserListQuery { users { id name phone email } }
рддрдм SQL рдХреНрд╡реЗрд░реА рдореЗрдВ рдмрджрд▓ рдЬрд╛рдПрдЧрд╛:
SELECT id, name, phone, email FROM users;
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рддрд░рд╣ рдХреА рд╕рд░рд▓ рдЪреБрдиреМрддреА рдХреЗ рд╕рд╛рде рдРрд╕рд╛ рдХрд░рдирд╛ рд╣рдореЗрд╢рд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдЕрдХреНрд╕рд░, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реЛрддреЗ рд╣реИрдВред рдХреБрдЫ рдХреНрд░рд┐рдпрд╛рдиреНрд╡рдпрдиреЛрдВ рдореЗрдВ, рд╣рдореЗрдВ рдКрдкрд░реА рдЧреНрд░рд╛рдлрд╝ рдкрд░ рдЕрдВрддрд┐рдо рдЧреНрд░рд╛рдлрдХреЙрд▓ рд╕реНрдХреАрдорд╛ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рд░рд┐рдЬрд╝реЙрд▓реНрд╡рд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╣рдордиреЗ рд░рд┐рд▓реЗ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рд╣реИ, рддреЛ рд╣рдо рдбреЗрдЯрд╛ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рдкреГрд╖реНрдареЛрдВ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬреЛ рдЗрд╕ рддрдереНрдп рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдЧреНрд░рд╛рдлрдХреНрдпреВрдПрд▓ рд╕реНрдХреАрдорд╛ рдХреЛ рдХреБрдЫ рдирд┐рдпрдореЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдЕрдкрдиреЗ рд╕реНрдХреАрдорд╛ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЯрд╛рдЗрдк рдХрд░рддреЗ рд╣реИрдВ (рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ):
import { GraphQLObjectType, GraphQLSchema, GraphQLString } from 'graphql'; import { connectionDefinitions, connectionArgs, nodeDefinitions, fromGlobalId, globalIdField, connectionFromArray, GraphQLResolveInfo, } from 'graphql-relay'; import { fieldsList } from 'graphql-fields-list'; export const { nodeInterface, nodeField } = nodeDefinitions(async (globalId: string) => { const { type, id } = fromGlobalId(globalId); let node: any = null; if (type === 'User') { node = await database.select(`SELECT id FROM user WHERE id="${id}"`); } return node; }); const User = new GraphQLObjectType({ name: 'User', interfaces: [nodeInterface], fields: { id: globalIdField('User', (user: any) => user.id), name: { type: GraphQLString }, email: { type: GraphQLString }, phone: { type: GraphQLString }, address: { type: GraphQLString }, } }); export const { connectionType: userConnection } = connectionDefinitions({ nodeType: User }); const Query = new GraphQLObjectType({ name: 'Query', fields: { node: nodeField, users: { type: userConnection, args: { ...connectionArgs }, async resolve( source: any, args: {[argName: string]: any}, context: any, info: GraphQLResolveInfo, ) {
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд░рд┐рд▓реЗ рд╕реЗ pageInfo
рд╕реНрдХреАрдо рдореЗрдВ edges
, node
, pageInfo
рдФрд░ cursor
рдиреЛрдбреНрд╕ рдХреЛ рдЬреЛрдбрд╝ рджреЗрдЧрд╛, рдЕрд░реНрдерд╛рддред рдЕрдм рд╣рдореЗрдВ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдЕрдкрдиреЗ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ (рдЕрдм рд╣рдо рдкреЗрдЬреЗрд╢рди рдкрд░ рдзреНрдпрд╛рди рдирд╣реАрдВ рджреЗрдВрдЧреЗ):
query UserListQuery { users { edges { node { id name phone email } } } }
рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐, resolve()
users
рдиреЛрдб рдкрд░ рд▓рд╛рдЧреВ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЕрдм рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдХреМрди рд╕реЗ рдлрд╝реАрд▓реНрдб рд╕реНрд╡рдпрдВ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдЕрдиреБрд░реЛрдз рдХрд┐рдП рдЧрдП рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдиреЗрд╕реНрдЯреЗрдб рдЪрд╛рдЗрд▓реНрдб рдиреЛрдб node
, рдЬреЛ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ, edges.node
рд╕рд╛рде users
рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рд╣реИред edges.node
рдкрдеред
fieldsList
graphql-fields-list
рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ graphql-fields-list
рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛, рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рдВрдмрдВрдзрд┐рдд path
рд╡рд┐рдХрд▓реНрдк рдкрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдБ рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ:
async resolve( source: any, args: {[argName: string]: any}, context: any, info: GraphQLResolveInfo, ) { const fields = fieldsList(info, { path: 'edges.node' }); return connectionFromArray( await database.query(`SELECT ${fields.join(',')} FROM users`), args ); }
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдореЗрдВ рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЧреНрд░рд╛рдлрдХрд╛рдЗ рд╕реНрдХреАрдорд╛ рдореЗрдВ рд╣рдордиреЗ рдХреЗрд╡рд▓ рдПрдХ рдлрд╝реАрд▓реНрдб рдирд╛рдо рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рдФрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реНрдХреАрдорд╛ рдореЗрдВ рдЕрдиреНрдп рдлрд╝реАрд▓реНрдб рдирд╛рдо рдЙрдирдХреЗ рдЕрдиреБрд░реВрдк рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдорд╛рди рд▓реЗрдВ рдХрд┐ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:
CREATE TABLE users ( id BIGINT PRIMARY KEY AUTO_INCREMENT, fullName VARCHAR(255), email VARCHAR(255), phoneNumber VARCHAR(15), address VARCHAR(255) );
рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЧреНрд░рд╛рдлрд╝ рдХреНрд╡реЗрд░реА рд╕реЗ рдлрд╝реАрд▓реНрдбреНрд╕ рдХреЛ SQL рдХреНрд╡реЗрд░реА рдореЗрдВ рдПрдореНрдмреЗрдб рдХрд┐рдП рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдирд╛рдо рдмрджрд▓рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд transform
рд╡рд┐рдХрд▓реНрдк рдореЗрдВ рдирд╛рдо рдЕрдиреБрд╡рд╛рдж рдХрд╛ рдирдХреНрд╢рд╛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ fieldsList
рдорджрдж рдХрд░реЗрдЧрд╛:
async resolve( source: any, args: {[argName: string]: any}, context: any, info: GraphQLResolveInfo, ) { const fields = fieldsList(info, { path: 'edges.node', transform: { phone: 'phoneNumber', name: 'fullName' }, }); return connectionFromArray( await database.query(`SELECT ${fields.join(',')} FROM users`), args ); }
рдФрд░ рдлрд┐рд░ рднреА, рдХрднреА-рдХрднреА, рдЦреЗрддреЛрдВ рдХреЗ рдПрдХ рдлреНрд▓реИрдЯ рд╕рд░рдгреА рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдирд╛ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рдиреЗрд╕реНрдЯрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдПрдХ рдЬрдЯрд┐рд▓ рд╕рдВрд░рдЪрдирд╛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ)ред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, graphql-fields-list
рд▓рд╛рдЗрдмреНрд░реЗрд░реА graphql-fields-list
fieldsMap
рдлрд╝рдВрдХреНрд╢рди рдмрдЪрд╛рд╡ рдореЗрдВ рдЖ рдЬрд╛рдПрдЧрд╛, рдЬреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдиреБрд░реЛрдзрд┐рдд рдлрд╝реАрд▓реНрдб рдХреЗ рдкреВрд░реЗ рдкреЗрдбрд╝ рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ:
const { fieldsMap } = require(`graphql-fields-list`);
рдпрджрд┐ рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдХ рдЬрдЯрд┐рд▓ рд╕рдВрд░рдЪрдирд╛ рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рд╣реИ, рддреЛ рд╣рдо рдпрд╣ рд╕рдм рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗред рдпрд╣ рд╡рд┐рдзрд┐ рд╡реИрдХрд▓реНрдкрд┐рдХ path
рддрд░реНрдХ рднреА рд▓реЗ рд╕рдХрддреА рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЖрдк рдкреВрд░реЗ рдкреЗрдбрд╝ рд╕реЗ рдХреЗрд╡рд▓ рдЖрд╡рд╢реНрдпрдХ рд╢рд╛рдЦрд╛ рдХрд╛ рдирдХреНрд╢рд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
const { fieldsMap } = require(`graphql-fields-list`);
рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХрд╛рд░реНрдб рдкрд░ рдирд╛рдореЛрдВ рдХрд╛ рд░реВрдкрд╛рдВрддрд░рдг рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИ рдФрд░ рдбреЗрд╡рд▓рдкрд░ рдХреА рджрдпрд╛ рдкрд░ рдмрдирд╛ рд╣реБрдЖ рд╣реИред
рд╡рд┐рдЦрдВрдбрди рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░реЗрдВ
GraphQL рдХреНрд╡реЗрд░реА рд╡рд┐рдЦрдВрдбрди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдЙрдкрднреЛрдХреНрддрд╛ рд╕реЗ рдРрд╕реА рдХреНрд╡реЗрд░реА рднреЗрдЬрдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдпрд╣рд╛рдБ рд╣рдо рдореВрд▓ рд╕реНрдХреАрдорд╛ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рддреЗ рд╣реИрдВ, рдереЛрдбрд╝реА рджреВрд░ рдХреА рдмрд╛рдд рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╕рд╣реА рд╣реИ):
query UsersFragmentedQuery { users { id ...NamesFramgment ...ContactsFragment } } fragment NamesFragment on User { name } fragment AddressFragment on User { address } fragment ContactsFragment on User { phone email ...AddressFragment }
рдЖрдкрдХреЛ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдирд╣реАрдВ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП, рдФрд░ fieldsList(info)
, рдФрд░ fieldsMap(info)
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЕрдкреЗрдХреНрд╖рд┐рдд рдкрд░рд┐рдгрд╛рдо рд▓реМрдЯрд╛рдПрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдЦрдВрдбреЛрдВ рдХреЗ рдЕрдиреБрд░реЛрдз рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, fieldsList(info)
['id', 'name', 'phone', 'email', 'address']
рдФрд░ fieldsMap(info)
рд▓реМрдЯрд╛рдПрдЧрд╛:
{ id: false, name: false, phone: false, email: false, address: false }
рдкреБрдирд╢реНрдЪ
рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЗрд╕ рд▓реЗрдЦ рдиреЗ рд╕рд░реНрд╡рд░ рдкрд░ рдЧреНрд░рд╛рдлрдХреЙрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдХреБрдЫ рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдкрд░ рдкреНрд░рдХрд╛рд╢ рдбрд╛рд▓рд╛ рдФрд░ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЗрд╖реНрдЯрддрдо рд╕рдорд╛рдзрд╛рди рдмрдирд╛рдиреЗ рдореЗрдВ рдЧреНрд░рд╛рдлрдХрд▓-рдлреАрд▓реНрдб-рд▓рд┐рд╕реНрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреА рдорджрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
UPD 1
рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг 1.1.0 рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ - рдЕрдиреБрд░реЛрдзреЛрдВ рдореЗрдВ @skip
рдФрд░ @include
рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рд╡рд┐рдХрд▓реНрдк рд╕рдХреНрд╖рдо рд╣реИ, рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЕрдХреНрд╖рдо рдХрд░реЗрдВ:
fieldsList(info, { withDirectives: false }) fieldsMap(info, null, false);