Graphql + axios - 过滤和排序

Posted

技术标签:

【中文标题】Graphql + axios - 过滤和排序【英文标题】:Graphql + axios - filtering and sorting 【发布时间】:2020-07-14 17:32:35 【问题描述】:

如何过滤和排序数据?关于排序,我应该使用 gatsby.js 吗?还有其他方法吗?

const RootQuery = new GraphQLObjectType(
  name: "Query",
  description: "Root Query",
  fields: () => (
    member: 
      type: MemberType,
      description: "A Single Person",
      args: 
        nick:  type: GraphQLString 
      ,
      resolve(parent, args) 
        return axios
          .get("http://25.98.140.121:5000/data")
          .then(members.find(member => member.nick === args.nick))
      
    ,
    members: 
      type: new GraphQLList(MemberType),
      description: "List of All Members",
      resolve(parent, args) 
        return axios
          .get("http://25.98.140.121:5000/data")
          .then(res => res.data)
      
    ,
    school: 
      type: SchoolType,
      description: "A Single School",
      args: 
        name:  type: GraphQLString 
      ,
      resolve: (parent, args) => schools.find(school => school.name === args.name)
    ,
    schools: 
      type: new GraphQLList(SchoolType),
      description: "List of All Schools",
      resolve(parent, args) 
        return axios
          .get("http://25.98.140.121:5000/data")
          .then(res => res.data)
    
  )
);

当然上面的过滤(学校,会员)不起作用,因为我不知道如何连接'find'和'return axios'。这样我没有得到过滤的数据,当我使用成员(昵称:John)或学校(名称:XYZ)。 希望你明白我的意思。我应该改变什么?或者,也许您有其他解决方案?

【问题讨论】:

请具体说明哪些代码“不起作用”。那里有四种不同的功能。你对哪一个有问题? 对不起,我已经编辑了我的帖子。 【参考方案1】:

离你不远了。 axios.get 返回一个 Promise,您在解析器中正确返回了它。您还正确地使用了then 来修改该 Promise 的已解析值。这里唯一的问题是传递给then 的参数应该是一个函数。所以你想做这样的事情:

return axios
  .get("http://25.98.140.121:5000/data")
  .then(res => res.data.find(member => member.nick === args.nick))

您传递给then 的任何函数都将使用您正在调用then 的Promise 的解析值调用。因此,如果axios.get 返回一个将解析为对象成员数组的 Promise,则该值将传递给您的函数。请注意,我们在上面定义了内联函数,但也可以单独定义:

const getMemberByNick = (res) => res.data.find(member => member.nick === args.nick)

return axios
  .get("http://25.98.140.121:5000/data")
  .then(getMemberByNick)

甚至

const getMemberByNick = (data) => data.find(member => member.nick === args.nick)

return axios
  .get("http://25.98.140.121:5000/data")
  .then(res => getMemberByNick(res.data))

【讨论】:

现在我得到“members.find 不是函数”。谢谢! 糟糕。 axios 返回一个response object,所以我们需要访问它的data 属性

以上是关于Graphql + axios - 过滤和排序的主要内容,如果未能解决你的问题,请参考以下文章

在 AWS Amplify GraphQL 中对结果进行排序而不进行过滤

Apollo GraphQL 服务器:按单独解析的字段过滤(或排序)

Gatsby 和 GraphQL - 如何在查询中过滤数组

向 graphql-ruby 实现添加多个过滤器

如果过滤器变量为空,GraphQL 禁用过滤

GraphQL从axios返回空数据[重复]