Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在GraphQL中,如何实现可选查询?_Graphql_Graphql Js - Fatal编程技术网

在GraphQL中,如何实现可选查询?

在GraphQL中,如何实现可选查询?,graphql,graphql-js,Graphql,Graphql Js,编辑:因为它似乎不清楚,我特别询问我应该在resolve函数中为后端查询发出的DB请求 我正在实现GraphQL查询,并且我很难准确地理解在给定查询中应该进行多少次调用。例如,这里有一个数据结构,其中包含用户和用户可以加入的俱乐部: User { UserID Clubs OtherStuff } Club{ ClubID ClubName } 我可以打以下电话给我的DB: 获取所有用户ID 获取用户ID的信息 获取用户的所有ClubIDs 获取俱乐部投标信息 我不明

编辑:因为它似乎不清楚,我特别询问我应该在resolve函数中为后端查询发出的DB请求

我正在实现GraphQL查询,并且我很难准确地理解在给定查询中应该进行多少次调用。例如,这里有一个数据结构,其中包含用户和用户可以加入的俱乐部:

User {
  UserID
  Clubs
  OtherStuff
}

Club{
  ClubID
  ClubName
}
我可以打以下电话给我的DB:

  • 获取所有用户ID
  • 获取用户ID的信息
  • 获取用户的所有ClubIDs
  • 获取俱乐部投标信息
我不明白的是,我是否应该在每次询问用户时都打这些电话。如果有人只查询用户ID,那么检索其他所有内容似乎是一种巨大的浪费。Clubs for User是否应该是一个完全独立的GraphQL查询,俱乐部是否应该只返回俱乐部出价,或者是否有一种方法可以有效地在Clubs字段中提供完整的俱乐部信息

编辑2: 好的,这是我的代码。我已经评论了我不确定该做什么的部分

const QueryType = new GraphQLObjectType({
  name: 'Query',
  fields: {
    User: userQueryField,
    Club: clubQueryField
  }
});

const clubQueryField = {
  type: new GraphQLList(ClubType),
  args: {
    UserID: {
      description: 'Returns all clubs the user is a part of',
      type: GraphQLID
    }
  },
  resolve(root, {UserID}) {
    //.....
  }
};


const userQueryField = {
  type: new GraphQLList(UserType),
  args: {
    UserID: {
      description: 'If omitted, returns a list of all users. \
      Otherwise, returns the user with the provided ID',
      type: GraphQLID
    }
  },
  resolve(root, {UserID}) {
    if(UserID){
      return new Promise((resolve, reject) => {
        getUserInfo(UserID, function(response){

          //HERE: I have tried different things, like clubQueryField(UserID) and clubQueryField.resolve, but with no luck
          UserID.Clubs = clubQueryField
          resolve([response]);
        });
      });
    }
  }
};
编辑3:用户类型定义

const UserType = new GraphQLObjectType({
  name: 'User',
  fields: () => ({
    UserID: {
      type: GraphQLID
    },
    Clubs: {
      type: new GraphQLList(ClubType)
    }
  })
});

GraphQL有一个延迟加载特性,负责查询中的其他字段。如果用户写入以下查询:

query{
   users{
    id
   }
}
它获取用户ID,显然不查找其他字段。但这完全取决于您的解析器。如果您这样编写解析器:
users{resolve:body=>get\u user\u id}
,它将从数据库中获取用户id。
希望这有帮助

GraphQLAPI是按类型和字段组织的,我建议为用户类型和俱乐部类型创建单独的查询,如果有人只查询用户ID,他们将使用用户查询

用户查询:

query {
  users {
   id
  }
}
查询俱乐部:

query {
  club {
   clubID
   clubName
   userId
  }
}
如果有人试图查询用户/俱乐部,您可以将俱乐部类型添加到用户类型,如下所示:

query {
  users {
   id
   club {
    clubID
    clubName
   }
  }
}
  query {
    User {
     userId
     email
     }
  }
query {
    User {
     userId
     email
     clubs {
        field1
        field2
       }
     }
  }
在您的用户类型中,将有一个名为club的字段,它将是club类型,在解析器中,它将使用
obj.userId
作为参数调用club查询,GraphQL的美妙之处在于,您可以让客户机决定获取哪些字段

您可以看到一个嵌套查询的示例

编辑:然后在您的情况下,您可以修改您的用户类型以包括用户所属的俱乐部,您不需要在
clubQueryField
中使用该条件,该条件将在客户正在进行的查询中,因此假设您的用户类型为:

用户类型:

export default new GraphQLObjectType({
  name: 'UserType',
  fields: {
    userId: {
      description: 'user id',
      type: GraphQLString
    },
    email: {
      description: 'user email',
      type: GraphQLString
    },
    clubs: {
      description: 'User clubs',
      type: new GraphQLList(ClubType),
      resolve: (obj, args, _) => {
        return getUserClubs(obj.userId);
      }
    },
  }
});
然后,如果您的客户机只需要用户,它将请求如下内容:

query {
  users {
   id
   club {
    clubID
    clubName
   }
  }
}
  query {
    User {
     userId
     email
     }
  }
query {
    User {
     userId
     email
     clubs {
        field1
        field2
       }
     }
  }
如果客户需要用户和俱乐部,它将要求如下:

query {
  users {
   id
   club {
    clubID
    clubName
   }
  }
}
  query {
    User {
     userId
     email
     }
  }
query {
    User {
     userId
     email
     clubs {
        field1
        field2
       }
     }
  }

这一切都是在解析器接口中完成的。因此,您需要传递解析器获取信息所需的信息。是的,解析程序应该进行所有这些调用。当然,您可以使用缓存来加快速度。从您的问题中,我可以看出您混淆了GraphQL查询和后端查询。我不认为我混淆了它们,但可能我的措辞不清楚。是什么让你觉得我把他们弄糊涂了?措辞。;-)用户类型在哪里定义?您应该将数据发送到USERTYPE,然后在那里解析它。我不明白你为什么用解析器写解析器。您提到了
type:newgraphqlist(UserType)
,但从未定义过它。在USERTYPE架构中,您应该发回一个用户ID数组。@popctrl很高兴它起作用了!嗯,我想你误解了我-我知道GraphQL会延迟加载,我的问题与解析函数中需要执行的DB请求有关,这取决于您的数据库和用于连接ot DB和获取数据的接口。例如,我使用RESTAPI,所以我使用JavaScript和fetch library在get_user_id()函数中获取用户id。哇,这比预期的要容易得多。那么如何实现这一点呢?我尝试了类似于
user.ClubIDs=clubQueryField
的方法,但我得到的结果是“应该是Iterable,但没有为field user.ClubIDs找到一个”。不查看代码就很难知道,但这听起来像是一个类型问题,如果您想让字段返回数组,那么您的类型必须是GraphQLList的新实例,即
new GraphQLList(俱乐部)
如果你能提供一些更好的代码示例,你必须确保你正在解析一个iterable集合,试着调试你的响应,看看你在db调用中返回了什么。请查看我的编辑。这确实是一个列表,我不确定还可以尝试什么。你需要有条件的任何特殊原因?请检查我的e答案是否定的