GraphQL Node.js:确定查询中使用的类型

use*_*931 2 javascript node.js graphql graphql-js express-graphql

鉴于我有一个具有类型的模式:用户、评论、帖子、图像;给定查询和架构,是否可以确定查询中使用的 GraphQL 类型?例如,如果客户有疑问

{
    user(userName: "username") {
        email
        comments
    }
}
Run Code Online (Sandbox Code Playgroud)

在本例中,查询具有 User 和 Comment 类型。是否可以使用 node.js 的 graphql-js 或 graphql 包以编程方式确定?

use*_*931 7

对于遇到此问题的其他人,我在访问和 TypeInfo 中找到了答案,这是一个函数,它接受 GraphQL 查询(文档)和模式,并返回模式中正在使用的数据类型。

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))
Run Code Online (Sandbox Code Playgroud)

  • VisitWithTypeInfo 是正确的选择。但无需手动执行输入(节点)和离开(节点),因为visitWithTypeInfo将创建一个在幕后自动执行此操作的访问者。 (2认同)