在 Apollo GraphQL 中请求日志记录

Request logging in Apollo GraphQL

环境:基于Apollo GraphQL服务器的Node应用(直接Apollo服务器,无express中间件)

我需要拦截请求并在处理管道的某些点记录它们。这是我目前所拥有的:

const server = new ApolloServer({
  // code removed for clarity

  context: async ({ req }) => {
// here is the first request log, preparing the context for the upcoming calls (traceability)
},
  formatError:  async (err: any) => {
// Here I would like to finish logging, but no context is available
},

问题在于同一最终用户请求的不同日志的可追溯性和成功请求的记录。

1- 如何在 formatError 方法中关联请求上下文?

2- 我应该在哪里记录成功执行的请求?

亚历克斯,

  1. 您可以创建可以从 ApolloError or node Error 类 扩展的自定义错误 类。通过将上下文分配给解析器函数中的错误对象,您可以从 formatError 方法中使用它。
  2. formatResponse 方法可以在这里使用,它提供 requestContext 作为参数。

formatError 和 formatResponse 方法用法:

const { ApolloServer, gql, makeExecutableSchema } = require("apollo-server");

const typeDefs = gql`
  type User {
    name: String
    username: String
    statusCode: Int
  }

  type Query {
    user: User
  }
`;

const dummyUser = { username: "dummyUser", name: "Dummy user" };

const user = () => {
  // throw new Error('Test error');
  return dummyUser;
};

const resolvers = {
  Query: { user }
};

const schema = makeExecutableSchema({
  typeDefs,
  resolvers,
});

const server = new ApolloServer({
  context: ({ req }) => ({ headers: req.headers }),
  schema,
  introspection: true,
  playground: true,
  formatResponse: (response) => {
    response.data.user.statusCode = 200;
    return response;
  },
  formatError: (error) => {
    error.message = "Error name";
    return error;
  }
});

server.listen().then(({ url }) => {
  console.log(`  Server ready at ${url}`);
});

在中间件中尝试可能是两者的替代方法(对此不确定)。