Graphql创建两个查询之间的关系。初始化前错误无法访问

Posted

技术标签:

【中文标题】Graphql创建两个查询之间的关系。初始化前错误无法访问【英文标题】:Graphql create relations between two queries.Error cannot access before initialization 【发布时间】:2020-05-25 00:30:37 【问题描述】:

我有这个代码:

const ProductType = new GraphQLObjectType(
    name: 'Product',
    fields: 
        id:  type: GraphQLID ,
        name:  type: GraphQLString ,
        category: 
            type: CategoryType,
            resolve: async (parent) => 
                return await Category.findOne(_id: parent.category);
            
        
    
);

const CategoryType = new GraphQLObjectType(
    name: 'Category',
    fields: 
        id:  type: GraphQLID ,
        name:  type: GraphQLString ,
        products: 
            type: ProductType,
            resolve: async (parent, args) => 
                return await Product.find(category: parent._id);
            
        
    
);

const Query = new GraphQLObjectType(
    name: 'Query',
    fields: 
        Categories: 
            type: new GraphQLList(CategoryType),
            resolve: async () => 
                return await Category.find();
            
        
    
);

当我尝试编译时,我得到 ReferenceError: Cannot access 'CategoryType' before initialization。 我知道首先我应该声明并且只能在使用之后声明,但是我在 YouTube 上的一节课中看到了类似的代码,我认为它应该可以工作,但事实并非如此。

【问题讨论】:

【参考方案1】:

fields 可以使用函数而不是对象。这样函数内部的代码就不会立即被评估:

fields: () => (
  id:  type: GraphQLID ,
  name:  type: GraphQLString ,
  category: 
    type: CategoryType,
    resolve: (parent) => Category.findOne(_id: parent.category),
  
)

【讨论】:

能否告诉我,上面的代码或使用 buildSchema 或 graphql-tools 哪个更快? @Muhammad 您的架构只会在您首次启动服务器时构建一次。这些不同方法之间的任何速度差异都可以忽略不计,并且不会影响您的服务器能够处理请求的速率。 非常感谢,请告诉我,您是否建议我们使用graphql-tools 作为模式语言?或者我们最好使用像 javascript 函数 fields(), resovle 一样存在于这段代码中??? graphql-tools 是 Facebook 开发的吗?

以上是关于Graphql创建两个查询之间的关系。初始化前错误无法访问的主要内容,如果未能解决你的问题,请参考以下文章

如何为 DynamoDB 创建 GraphQL 查询

如何使用 GraphQL 查询 Wordpress 关系字段?

查询放大graphql多对多关系

如何在graphql中查询两个日期

使用 NestJS、TypeORM、GraphQL 更新具有实体之间关系的 PSQL 表

GraphQl 操作中的参数?