是否可以在GraphQL查询的最终响应中添加另一个字段?

是否可以在GraphQL查询的最终响应中添加另一个字段?,graphql,Graphql,我一直在研究如何添加GraphQL响应的另一个根属性,但在1小时后什么也没有发现 通常,GraphQL查询如下所示: { myQuery() { name } } 它的答复是: { "data": { "myQuery": [] } } 我很好奇是否可以在这个响应中添加另一个根属性,比如“meta” 这是可能的吗?如果不是的话,解决GraphQL问题的最佳方法是什么 谢谢 apollo server中间件可以配置许多配置选项,包括允许修

我一直在研究如何添加GraphQL响应的另一个根属性,但在1小时后什么也没有发现

通常,GraphQL查询如下所示:

{
   myQuery() {
       name
   }
}
它的答复是:

{
    "data": {
       "myQuery": []
    }
}
我很好奇是否可以在这个响应中添加另一个根属性,比如“meta”

这是可能的吗?如果不是的话,解决GraphQL问题的最佳方法是什么


谢谢

apollo server中间件可以配置许多配置选项,包括允许修改传出GraphQL响应的
formatResponse
函数

const formatResponse = (response) => {
  return {
    meta
    ...response
  }
}

app.use('/graphql', bodyParser.json(), graphqlExpress({
  schema,
  formatResponse,
}));
您可以将req对象向下传递到您的上下文,在解析器中对其进行变异,然后在formatResponse中使用结果。类似于

app.use('/graphql', bodyParser.json(), (req, res, next) => graphqlExpress({
  schema,
  formatResponse: (gqlResponse) => ({
    ...gqlResponse
    meta: req.metadata
  }),
})(req, res, next));
但是,通常情况下,您希望将元数据作为实际模式的一部分包含在数据中。这还允许您潜在地请求多个查询,并获取所有查询的元数据

根据数据的结构,有多种方法可以做到这一点,但下面是一个示例:

type Query {
  getFoos: QueryResponse
  getBars: QueryResponse  
}

type QueryResponse {
  results: [Result]
  meta: MetaData
}

union Result = Bar | Foo

阿波罗服务器中间件可以配置许多配置选项,包括允许修改传出GraphQL响应的
formatResponse
函数

const formatResponse = (response) => {
  return {
    meta
    ...response
  }
}

app.use('/graphql', bodyParser.json(), graphqlExpress({
  schema,
  formatResponse,
}));
您可以将req对象向下传递到您的上下文,在解析器中对其进行变异,然后在formatResponse中使用结果。类似于

app.use('/graphql', bodyParser.json(), (req, res, next) => graphqlExpress({
  schema,
  formatResponse: (gqlResponse) => ({
    ...gqlResponse
    meta: req.metadata
  }),
})(req, res, next));
但是,通常情况下,您希望将元数据作为实际模式的一部分包含在数据中。这还允许您潜在地请求多个查询,并获取所有查询的元数据

根据数据的结构,有多种方法可以做到这一点,但下面是一个示例:

type Query {
  getFoos: QueryResponse
  getBars: QueryResponse  
}

type QueryResponse {
  results: [Result]
  meta: MetaData
}

union Result = Bar | Foo

您也可以在响应中添加任何内容。。。请按照下面的代码

app.use('/graphql', bodyParser.json(), graphqlExpress(req => {
      return {
        schema: tpSchemaNew,
        context: {
          dbModel
        },
        formatError: err => {
          if (err.originalError && err.originalError.error_message) {
            err.message = err.originalError.error_message;
          }
          return err;
        },
        formatResponse : res => {
          res['meta'] = 'Hey';
          return res;
        }
      }
    }))

您也可以在响应中添加任何内容。。。请按照下面的代码

app.use('/graphql', bodyParser.json(), graphqlExpress(req => {
      return {
        schema: tpSchemaNew,
        context: {
          dbModel
        },
        formatError: err => {
          if (err.originalError && err.originalError.error_message) {
            err.message = err.originalError.error_message;
          }
          return err;
        },
        formatResponse : res => {
          res['meta'] = 'Hey';
          return res;
        }
      }
    }))
特定于阿波罗服务器: 只需在前面的答案中添加另一个有用的参数,
requestContext

如果您对从中提取值感兴趣(例如,传递给解析器的上下文),可以执行以下操作。但是,请注意,上下文可能包含被认为是私有的敏感数据。如果不小心,您可能会泄露身份验证数据和机密

const server = new ApolloServer({
  schema,
  formatResponse: (response, requestContext) => {
    //return response
    
    const userId = requestContext.context.user.id
    
    response = Object.assign(response, {
      extensions: {
        meta: {
          userId: userId
        }
      }
    }

    return response
  },
})
上述内容将在gql查询响应中返回类似的内容(请注意extensions对象):

特定于阿波罗服务器: 只需在前面的答案中添加另一个有用的参数,
requestContext

如果您对从中提取值感兴趣(例如,传递给解析器的上下文),可以执行以下操作。但是,请注意,上下文可能包含被认为是私有的敏感数据。如果不小心,您可能会泄露身份验证数据和机密

const server = new ApolloServer({
  schema,
  formatResponse: (response, requestContext) => {
    //return response
    
    const userId = requestContext.context.user.id
    
    response = Object.assign(response, {
      extensions: {
        meta: {
          userId: userId
        }
      }
    }

    return response
  },
})
上述内容将在gql查询响应中返回类似的内容(请注意extensions对象):


您在后端使用什么来实现GraphQL API?我在使用Apollo的GraphQL服务器--您在后端使用什么来实现GraphQL API?我在使用Apollo的GraphQL服务器--感谢您扩展formatResponse答案并显示使用模式的替代方案。将此作为最佳答案。感谢您扩展formatResponse答案并显示使用模式的备选方案。这是最好的答案。请注意,如果您使用的是Typescript,GraphQLResponse类型中没有
meta
键。您需要将
meta
放在
extensions
中,正如上面的示例所示,如果您使用的是Typescript,GraphQLResponse类型中没有
meta
键。您需要将
meta
放在
extensions
中,如上面的示例所示