Как отправить запрос ad-hoc с помощью Relay?
Я новичок в Relay, все еще пытаясь обернуть вокруг себя голову. Основываясь на моем понимании, Relay связывает запросы с компонентами. Таким образом, вы можете сказать, что компонент должен быть предоставлен x, y и z с сервера GraphQL. Основываясь на моем понимании, официальная библиотека react-relay
отправит эти запросы в соответствующее время, вероятно, когда компонент будет отображаться.
Все это имеет смысл для явных вариантов использования, таких как просто отображение списка данных.
То, что я запутался в том, как это сделать, заключается в том, как отправить запрос, который может не попадать в категорию того, что было бы привязано к компоненту. Запрос, такой как запрос, который пытается извлечь токен сеанса аутентификации пользователя или что-то еще. Это моя текущая ситуация: я пытаюсь создать форму входа пользователя, которая извлекает токен сеанса из GraphQL. У меня есть параметризованное поле GraphQL, которое требует аргументов имени пользователя и пароля и вернет токен сеанса, если они действительны. Я просто не могу понять, как использовать Relay для запроса этого токена сеанса.
Мне просто нужно было бы отправить запрос и обработать ответ (поместите этот токен сеанса в состояние приложения React).
Любые идеи?
Ответы
Ответ 1
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` */
}
});
Если данные не нужно синхронизировать с кешем ретрансляции, вы также можете использовать простой сетевой запрос (XHR, выборка и т.д.) для отправки простого строкового запроса в конечную точку GraphQL.
Ответ 2
Честно говоря, проще всего использовать отдельную библиотеку. Я использую 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);
});