Журнал apollo-сервера GraphQL-запроса и переменных для каждого запроса - PullRequest
0 голосов
/ 20 января 2019

Как использовать apollo-server 2.2.1 или новее, как вести журнал для каждого запроса, запроса и переменных?

Это похоже на простое требование и общий случай использования, но документация очень расплывчатая , и объект query, переданный formatResponse , больше не имеет queryString и variables свойства.

Ответы [ 3 ]

0 голосов
/ 23 января 2019

Решение Дэна, в основном, решает проблему, но если вы хотите зарегистрировать ее без использования Express, вы можете захватить ее в контексте, показанном в примере ниже.

const server = new ApolloServer({
schema,
context: params => () => {
    console.log(params.req.body.query);
    console.log(params.req.body.variables);
}
});
0 голосов
/ 29 января 2019

Ответ Амита работает (сегодня), но ИМХО, он немного хакерский и может работать не так, как ожидается в будущем, или может работать некорректно в некоторых сценариях.

Например, первое, что я подумал, когда увидел, что «это может не сработать, если запрос недействителен», получается, что сегодня работает, когда запрос недействителен. Потому что в текущей реализации контекст оценивается до проверки запроса. Однако это деталь реализации, которая может измениться в будущем. Например, что если однажды команда 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.

0 голосов
/ 22 января 2019

Если бы мне пришлось регистрировать запрос и переменные, я бы, вероятно, использовал apollo-server-express вместо apollo-server, чтобы я мог добавить отдельное промежуточное программное обеспечение Express до graphql, которое регистрировало это для меня:

const express = require('express')
const { ApolloServer } = require('apollo-server-express')
const { typeDefs, resolvers } = require('./graphql')

const server = new ApolloServer({ typeDefs, resolvers })
const app = express()

app.use(bodyParser.json())
app.use('/graphql', (req, res, next) => {
  console.log(req.body.query)
  console.log(req.body.variables)
  return next()
})

server.applyMiddleware({ app })

app.listen({ port: 4000}, () => {
  console.log(`? Server ready at http://localhost:4000${server.graphqlPath}`)
})
...