Как отправить специальный запрос с помощью Relay?

Я новичок в Relay, все еще пытаюсь понять это. Насколько я понимаю, Relay связывает запросы с компонентами. Таким образом, вы можете сказать, что компонент должен быть предоставлен x, y и z с сервера GraphQL. Насколько я понимаю, официальная библиотека react-relay будет отправлять эти запросы в нужное время, вероятно, когда компонент будет отображаться.

Все это имеет смысл для простых случаев использования, таких как простое отображение списка данных.

Однако я не понимаю, как это сделать, так это как отправить запрос, который может не совсем подпадать под категорию чего-то, что будет привязано к компоненту. Запрос, например, который пытается получить токен сеанса аутентификации пользователя или что-то в этом роде. Это моя текущая ситуация: я пытаюсь создать форму входа пользователя, которая извлекает токен сеанса из GraphQL. У меня есть параметризованное поле GraphQL, которое требует аргументов имени пользователя и пароля и возвращает токен сеанса, если они действительны. Я просто не могу понять, как использовать Relay для запроса этого токена сеанса.

По сути, мне просто нужно отправить запрос и обработать ответ (поместите этот токен сеанса в состояние приложения React).

Любые идеи?


person Ryan    schedule 02.12.2015    source источник
comment
Я нашел это, задав аналогичный вопрос stackoverflow.com/questions/34346273/ Разочаровывает отсутствие ответа на ваш вопрос. копия @steveluscher   -  person bsr    schedule 18.12.2015
comment
Столкнувшись с множеством вопросов и проблем без четких ответов, я решил пока просто отказаться от GraphQL и Relay. Я вернулся к Redux и просто к типичному HTTP RESTful API. Я вижу много хороших вещей с GraphQL и Relay, но слишком много вопросов, связанных с такими вещами, как специальные запросы (или как сделать такой рабочий процесс с Relay), а также с вещами типа авторизации пользователя, например, какие поля должны быть видны для кто. Стало требоваться слишком много серверного и клиентского кода для отображения определенных полей пользователям с разрешением. Хотя все остальное мне очень понравилось.   -  person Ryan    schedule 18.12.2015
comment
спасибо вам за ответ.   -  person bsr    schedule 19.12.2015
comment
Следует подумать о переименовании этого для лучшего SEO. Это скрытая жемчужина Интернета.   -  person jackncoke    schedule 28.01.2017


Ответы (2)


API-интерфейсы Relay в первую очередь ориентированы на упрощение получения данных для компонентов, но Relay также поддерживает специальные запросы. API относительно низкоуровневый, с отдельными функциями для получения и чтения данных. Вот пример того, как получить специальный запрос и получить доступ к ответу:

// Create a query with values for any variables:
var query = Relay.createQuery(Relay.QL`query ... `, {var: 'value'});
// Fetch any fields that have not yet been cached:
Relay.Store.primeCache({query}, readyState => {
  if (readyState.done) {
    // When all data is ready, read the data from the cache:
    var data = Relay.Store.readQuery(query)[0];
    /* access fields on `data` */
  }
});

Если данные не нужно синхронизировать с кешем Relay, вы также можете использовать простой сетевой запрос (XHR, выборка и т. д.), чтобы отправить простой строковый запрос на конечную точку GraphQL.

person Joe Savona    schedule 21.12.2015
comment
Если вы хотите получать самые последние данные с вашего сервера, вы также можете использовать Relay.Store.forceFetch({query}, readyStateCallback) - person Stefan van de Vooren; 08.01.2017

Честно говоря, проще всего использовать отдельную библиотеку. Я использую Lokka в своих node проектах, и это очень просто и надежно.

// config
const Lokka = require('lokka').Lokka;
const Transport = require('lokka-transport-http').Transport;

const client = new Lokka({
  transport: new Transport('http://graphql-swapi.parseapp.com/')
});



// query
client.query(`
  {
    allFilms {
      films {
        ...${filmInfo}
      }
    }
  }
`).then(result => {
  console.log(result.allFilms.films);
});
person Brandon    schedule 24.01.2017