Graphql + ax ios - фильтрация и сортировка - PullRequest
0 голосов
/ 02 апреля 2020

Как я могу фильтровать и сортировать данные? Что касается сортировки, я должен использовать Гэтсби. 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 ax * ios'.
Таким образом, я не получал отфильтрованные данные, когда я использовал член (ник: Джон) или школу (имя: XYZ).
Надеюсь, вы понимаете, о чем я. Что я должен изменить? Или, может быть, у вас есть другое решение?

1 Ответ

1 голос
/ 02 апреля 2020

Ты не слишком далеко. axios.get возвращает Обещание, которое вы правильно возвращаете в своем преобразователе. Вы также правильно используете then для изменения разрешенного значения этого Обещания. Единственная проблема здесь в том, что аргумент, передаваемый then, должен быть функцией. Итак, вы хотите сделать что-то вроде:

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

Независимо от того, какую функцию вы передаете then, она будет вызываться с разрешенным значением обещания, которое вы вызываете then. Так что, если 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))
...