Не удалось получить список в реле реакции

Я следую схеме, указанной здесь

Я хочу получить всех пользователей, поэтому я обновил свою схему следующим образом

var Root = new GraphQLObjectType({
  name: 'Root',
  fields: () => ({
    user: {
      type: userType,
      resolve: (rootValue, _) => {
        return getUser(rootValue)
      }
    },
    post: {
      type: postType,
      args: {
         ...connectionArgs,
          postID: {type: GraphQLString}
        },
      resolve: (rootValue, args) => {
       return getPost(args.postID).then(function(data){
        return data[0];
       }).then(null,function(err){
        return err;
       });
      }
    },

    users:{
      type: new GraphQLList(userType),
      resolve: (root) =>getUsers(),
    },
  })
});

И в database.js

export function getUsers(params) {
  console.log("getUsers",params)
  return new Promise((resolve, reject) => {
      User.find({}).exec({}, function(err, users) {
        if (err) {
          resolve({})
        } else {
          resolve(users)
        }
      });
  })
}

Я получаю результаты в / graphql как

{
  users {
    id,
    fullName
  } 
}

и результаты как

{
  "data": {
    "users": [
      {
        "id": "VXNlcjo1Nzk4NWQxNmIwYWYxYWY2MTc3MGJlNTA=",
        "fullName": "Akshay"
      },
      {
        "id": "VXNlcjo1Nzk4YTRkNTBjMWJlZTg1MzFmN2IzMzI=",
        "fullName": "jitendra"
      },
      {
        "id": "VXNlcjo1NzliNjcyMmRlNjRlZTI2MTFkMWEyMTk=",
        "fullName": "akshay1"
      },
      {
        "id": "VXNlcjo1NzliNjgwMDc4YTYwMTZjMTM0ZmMxZWM=",
        "fullName": "Akshay2"
      },
      {
        "id": "VXNlcjo1NzlmMTNkYjMzNTNkODQ0MmJjOWQzZDU=",
        "fullName": "test"
      }
    ]
  }
}

но если я попытаюсь получить это ввиду как

export default Relay.createContainer(UserList, {
  fragments: {
    userslist: () => Relay.QL`
      fragment on User @relay(plural: true) {
            fullName,
            local{
              email
            },
            images{
              full
            },
            currentPostCount,
            isPremium,
      }
    `,
  },
});

Я получаю сообщение об ошибке Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.

Скажите, пожалуйста, что мне не хватает. Я много пробовал с @relay и без него (множественное число: правда). Также попытался обновить схему с аргументами как

    users:{
      type: new GraphQLList(userType),
      args: {
        names: {
          type: GraphQLString,
        },
        ...connectionArgs,
      },
      resolve: (root, {names}) =>connectionFromArray(getUsers(names)),
    },

но я получил ошибку Cannot read property 'after' of undefined in implementing react-relay Заранее спасибо.


person akshay    schedule 04.08.2016    source источник
comment
Где вы определяете userslist?   -  person Ahmad Ferdous    schedule 04.08.2016
comment
Я определил список пользователей в routes.js   -  person akshay    schedule 04.08.2016
comment
Relay.ql '{пользователи}   -  person akshay    schedule 04.08.2016
comment
Как подсказывает ошибка, вы пробовали неминифицированную среду разработки и получили подробное сообщение об ошибке?   -  person Ahmad Ferdous    schedule 04.08.2016
comment
Я получил сообщение Invariant Violation: RelayOSSNodeInterface: Ожидаемая полезная нагрузка для корневого поля users будет одним результатом без массива, вместо этого получил массив с 5 результатами   -  person akshay    schedule 05.08.2016
comment
Какую версию Relay вы используете? Теперь поддерживается корневое поле типа списка в запросе.   -  person Ahmad Ferdous    schedule 05.08.2016
comment
вот список версий всех пакетов реле, react-relay: 0.8.1, graphql-relay: 0.4.1, isomorphic-relay-router: 0.8.0-beta.0, isomorphic-relay: 0.7.0-beta.0 , локальная-схема-реле: 0.5.0, плагин-реле-бабель: 0.8.1,   -  person akshay    schedule 05.08.2016
comment
Было бы неплохо взглянуть на пример эстафеты из звездных войн. У него также есть запрос, в котором   -  person Ahmad Ferdous    schedule 05.08.2016


Ответы (1)


В настоящее время Relay поддерживает только три типа корневых полей (см. facebook / relay # 112):

  • Root field without arguments, returning a single node:
    • e.g. { user { id } } returning {"id": "123"}
  • Root field with one argument, returning a single node:
    • e.g. { post(id: "456") { id } } returning {"id": "456"}
  • Root field with one array argument returning an array of nodes with the same size as the argument array (also known as "a plural identifying root field"):
    • e.g. { users(ids: ["123", "321"]) { id } } returning [{"id": "123"}, {"id": "321"}]

Обходной путь - создать корневое поле (часто называемое viewer), возвращающее узел с этими полями. При вложении в Viewer (или любой другой узел) поля могут иметь любой возвращаемый тип, включая список или соединение. Когда вы обернули поля в этот объект на своем сервере GraphQL, вы можете запросить их следующим образом:

{
  viewer {
    users {
      id,
      fullName,
    }
  }
}

Тип Viewer - это тип узла, и, поскольку будет только один его экземпляр, его id должен быть константой. Вы можете использовать помощник globalIdField для определения поля id и добавить любые другие поля, которые вы хотите запросить с помощью Relay:

const viewerType = new GraphQLObjectType({
  name: 'Viewer',
  interfaces: [nodeInterface],
  fields: {
    id: globalIdField('Viewer', () => 'VIEWER_ID'),
    users:{
      type: new GraphQLList(userType),
      resolve: (viewer) => getUsers(),
    },
  },
});

На клиенте вам нужно изменить корневой запрос в вашем маршруте на { viewer } и определить фрагмент на Viewer:

export default Relay.createContainer(UserList, {
  fragments: {
    viewer: () => Relay.QL`
      fragment on Viewer {
        users {
          fullName,
          local {
            email,
          },
          images {
            full,
          },
          currentPostCount,
          isPremium,
        }
      }
    `,
  },
});
person fson    schedule 07.08.2016
comment
Как средство просмотра должно выглядеть в моей схеме? - person akshay; 08.08.2016
comment
@akshay Я добавил в свой ответ пример определения типа Viewer. - person fson; 09.08.2016
comment
Спасибо, это работает как шарм .. :-) - person akshay; 10.08.2016