Graphql + Axios-过滤和排序

时间:2020-04-02 16:47:48

标签: graphql axios

如何过滤和排序数据?关于排序,我应该使用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)
    }
  })
});

当然,上述过滤(学校,成员)是行不通的,因为我不知道如何连接“查找”和“返回axios”。
这样一来,当我我使用成员(昵称:John)或学校(名称:XYZ)。
希望你明白我的意思。我应该改变什么?也许您还有其他解决方案?

1 个答案:

答案 0 :(得分:1)

距离您不太远。 axios.get返回一个Promise,您已在解析器中正确返回了该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))