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