GraphQL Node.js:确定查询中使用的类型
GraphQL Node.js: determine what types are used within a query
鉴于我有一个具有以下类型的模式:用户、评论、Post、图像;给定查询和模式,是否可以确定查询中使用的 GraphQL 类型?
例如如果客户有查询
{
user(userName: "username") {
email
comments
}
}
在本例中,查询具有类型 User 和 Comment。是否可以使用 node.js 的 graphql-js 或 graphql 包以编程方式确定?
您必须使用 GraphQLObjectType
创建类型,例如:
export default new GraphQLObjectType(
({
name: 'User',
description: 'Represents a User',
fields: () => ({
_id: {
type: GraphQLNonNull(GraphQLString),
resolve: user => user._id,
},
name: {
type: GraphQLNonNull(GraphQLString),
description: 'Name of the user',
resolve: user => user.name,
},
createdAt: {
type: GraphQLString,
description: '',
resolve: user => user.createdAt.toISOString(),
},
updatedAt: {
type: GraphQLString,
description: '',
resolve: user => user.updatedAt.toISOString(),
},
}),
}: GraphQLObjectTypeConfig<User, GraphQLContext>),
);
然后你可以在另一种类型上使用这个 UserType
,例如声明 type: GraphQLNonNull(UserType)
。
https://graphql.org/graphql-js/constructing-types/
希望对您有所帮助:)
给定一个表示某些 GraphQL 操作的有效文档字符串,您可以将该字符串解析为 AST。
import { parse, validate } from 'graphql'
const document = parse(someDocumentString)
// if you want to validate your document to verify it matches your schema
const errors = validate(schema, document)
AFAIK,没有用于获取文档中类型数组的实用函数,如果这是您所要求的,但您可以遍历 AST 并从中收集任何信息。例如,下面是 GraphiQL 如何生成变量映射到它们相应类型的映射:
import { typeFromAST } from 'graphql'
export function collectVariables(schema, documentAST) {
const variableToType = Object.create(null);
documentAST.definitions.forEach(definition => {
if (definition.kind === 'OperationDefinition') {
const variableDefinitions = definition.variableDefinitions;
if (variableDefinitions) {
variableDefinitions.forEach(({ variable, type }) => {
const inputType = typeFromAST(schema, type);
if (inputType) {
variableToType[variable.name.value] = inputType;
}
});
}
}
});
return variableToType;
}
对于遇到此问题的任何其他人,我在访问和 TypeInfo 中找到了答案
这是一个函数,它接受 GraphQL 查询(文档)和模式以及 returns 正在使用模式中的哪些数据类型。
import { visit } from 'graphql/language/visitor'
import { parse } from 'graphql/language'
import { TypeInfo, visitWithTypeInfo } from 'graphql'
import { schema as _schema } from '../src/schema/schema'
const getQueryTypes = (schema, query) => {
const typeInfo = new TypeInfo(schema)
var typesMap = {}
var visitor = {
enter(node) {
typeInfo.enter(node)
typesMap[typeInfo.getType()] = true
},
leave(node) {
typesMap[typeInfo.getType()] = true
typeInfo.leave(node)
}
}
visit(parse(query), visitWithTypeInfo(typeInfo, visitor))
return Object.keys(typesMap)
}
const _query = `
query {
...
}
`
console.log(getQueryTypes(_schema, _query))
鉴于我有一个具有以下类型的模式:用户、评论、Post、图像;给定查询和模式,是否可以确定查询中使用的 GraphQL 类型? 例如如果客户有查询
{
user(userName: "username") {
email
comments
}
}
在本例中,查询具有类型 User 和 Comment。是否可以使用 node.js 的 graphql-js 或 graphql 包以编程方式确定?
您必须使用 GraphQLObjectType
创建类型,例如:
export default new GraphQLObjectType(
({
name: 'User',
description: 'Represents a User',
fields: () => ({
_id: {
type: GraphQLNonNull(GraphQLString),
resolve: user => user._id,
},
name: {
type: GraphQLNonNull(GraphQLString),
description: 'Name of the user',
resolve: user => user.name,
},
createdAt: {
type: GraphQLString,
description: '',
resolve: user => user.createdAt.toISOString(),
},
updatedAt: {
type: GraphQLString,
description: '',
resolve: user => user.updatedAt.toISOString(),
},
}),
}: GraphQLObjectTypeConfig<User, GraphQLContext>),
);
然后你可以在另一种类型上使用这个 UserType
,例如声明 type: GraphQLNonNull(UserType)
。
https://graphql.org/graphql-js/constructing-types/
希望对您有所帮助:)
给定一个表示某些 GraphQL 操作的有效文档字符串,您可以将该字符串解析为 AST。
import { parse, validate } from 'graphql'
const document = parse(someDocumentString)
// if you want to validate your document to verify it matches your schema
const errors = validate(schema, document)
AFAIK,没有用于获取文档中类型数组的实用函数,如果这是您所要求的,但您可以遍历 AST 并从中收集任何信息。例如,下面是 GraphiQL 如何生成变量映射到它们相应类型的映射:
import { typeFromAST } from 'graphql'
export function collectVariables(schema, documentAST) {
const variableToType = Object.create(null);
documentAST.definitions.forEach(definition => {
if (definition.kind === 'OperationDefinition') {
const variableDefinitions = definition.variableDefinitions;
if (variableDefinitions) {
variableDefinitions.forEach(({ variable, type }) => {
const inputType = typeFromAST(schema, type);
if (inputType) {
variableToType[variable.name.value] = inputType;
}
});
}
}
});
return variableToType;
}
对于遇到此问题的任何其他人,我在访问和 TypeInfo 中找到了答案 这是一个函数,它接受 GraphQL 查询(文档)和模式以及 returns 正在使用模式中的哪些数据类型。
import { visit } from 'graphql/language/visitor'
import { parse } from 'graphql/language'
import { TypeInfo, visitWithTypeInfo } from 'graphql'
import { schema as _schema } from '../src/schema/schema'
const getQueryTypes = (schema, query) => {
const typeInfo = new TypeInfo(schema)
var typesMap = {}
var visitor = {
enter(node) {
typeInfo.enter(node)
typesMap[typeInfo.getType()] = true
},
leave(node) {
typesMap[typeInfo.getType()] = true
typeInfo.leave(node)
}
}
visit(parse(query), visitWithTypeInfo(typeInfo, visitor))
return Object.keys(typesMap)
}
const _query = `
query {
...
}
`
console.log(getQueryTypes(_schema, _query))