Ответ Амита работает (сегодня), но ИМХО, он немного хакерский и может работать не так, как ожидается в будущем, или может работать некорректно в некоторых сценариях.
Например, первое, что я подумал, когда увидел, что «это может не сработать, если запрос недействителен», получается, что сегодня работает, когда запрос недействителен. Потому что в текущей реализации контекст оценивается до проверки запроса. Однако это деталь реализации, которая может измениться в будущем. Например, что если однажды команда apollo решит, что было бы выигрыш в производительности, чтобы оценить контекст только после того, как запрос был проанализирован и проверен? На самом деле это то, что я ожидал: -)
Я пытаюсь сказать, что если вы просто хотите быстро что-то записать, чтобы что-то отладить в вашей dev
среде, тогда решение Amit определенно является подходящим.
Однако, если вы хотите зарегистрировать журналы для производственной среды, то использование функции context
, вероятно, не лучшая идея. В этом случае я бы установил graphql-extensions
и использовал бы их для регистрации, что-то вроде:
const { print } = require('graphql');
class BasicLogging {
requestDidStart({queryString, parsedQuery, variables}) {
const query = queryString || print(parsedQuery);
console.log(query);
console.log(variables);
}
willSendResponse({graphqlResponse}) {
console.log(JSON.stringify(graphqlResponse, null, 2));
}
}
const server = new ApolloServer({
typeDefs,
resolvers,
extensions: [() => new BasicLogging()]
});
Edit:
Как указал Дэн, устанавливать пакет graphql-extensions
не нужно, поскольку он был интегрирован в пакет apollo-server-core
.