#javascript #apollo #react-apollo #apollo-client #apollo-server
#javascript #apollo #реагировать-apollo #apollo-клиент #apollo-сервер
Вопрос:
Я продолжаю видеть примеры настройки контекста на клиенте Apollo следующим образом :
new ApolloClient({
uri: '...',
request(operation) {
const currentUser = readStore<CurrentUser>("currentUser");
currentUser amp;amp;
operation.setContext({
headers: { authorization: currentUser.token },
other: "things"
});
}
});
}
С вещами, которые идут в заголовки запроса, и «другими» вещами. Тем не менее, после более чем 2 часов исследований я не смог найти ни одного примера того, что другие данные контекста извлекаются на другом конце, на сервере Apollo.
Похоже, что все примеры касаются токенов авторизации, но как я могу получить остальные, скажем, с помощью apollo-server-express
?
Вот что у меня есть на данный момент :
const apollo = new ApolloServer({
typeDefs,
resolvers,
context({ req }): Context {
const currentUser =
(req.headers.authorization amp;amp;
(jwt.verify(
req.headers.authorization,
process.env.JWTSIGN
) as Context["currentUser"])) ||
null;
// Ok for req.headers.authorization, how to I get "other: things" ?
return {
ip: req.ip,
currentUser
};
}
});
context
Функция здесь получает только запрос и объект res из Express. После некоторых журналов, похоже, он не содержит нужных мне данных.
Спасибо.
Ответ №1:
Единственная причина, по которой заголовки отображаются совместно в примере, которым вы поделились, заключается в том, что ApolloClient
использует headers
значение внутри своего контекста для заполнения HTTP-заголовков, которые он отправляет при выполнении запроса. Затем эти заголовки анализируются express
и становятся доступными для req
объекта. Контекст, используемый ApolloClient
, является строго клиентским. Контекст, используемый ApolloServer
, является строго серверным. Вы не можете использовать контекст ApolloClient
для передачи произвольных значений на ваш сервер — для этого вы должны использовать заголовки или аргументы внутри вашего запроса GraphQL.