Javascript 发送前修改Graphql的响应
我正在寻找一种在graphql查询或变异发出之前修改其响应对象的方法 基本上除了数据对象之外,我还希望有额外的字段,比如代码和消息 目前,我正在通过将字段直接添加到我的GQL模式来解决这个问题,例如,以下类型定义:Javascript 发送前修改Graphql的响应,javascript,graphql,apollo-server,Javascript,Graphql,Apollo Server,我正在寻找一种在graphql查询或变异发出之前修改其响应对象的方法 基本上除了数据对象之外,我还希望有额外的字段,比如代码和消息 目前,我正在通过将字段直接添加到我的GQL模式来解决这个问题,例如,以下类型定义: type Query { myItems: myItemResponse } type myItemResponse { myItem: Item code: String! success: Boolean! message: String! } 回答本身应
type Query {
myItems: myItemResponse
}
type myItemResponse {
myItem: Item
code: String!
success: Boolean!
message: String!
}
回答本身应该是这样的:
{
data: {
myItems: {
myItem: [ ... fancy Items ... ],
message: 'successfully retrieved fancy Items',
code: <CODE_FOR_SUCCESSFUL_QUERY>
}
}
}
不幸的是,这并没有达到预期的效果。在使用express Middleware之前,我想问一下是否有可能通过apollo server开箱即用,或者我可能只是缺少formatResponse函数中的某些内容。经过大量研究,我发现graphql响应中唯一允许的顶级属性是数据、错误和扩展。在这里,您可以在GitHub中找到相关问题 出于我的目的,我可能会使用extensions字段。 对GraphQL操作的响应必须是映射 如果操作遇到任何错误,则响应映射必须包含带有键错误的条目。“错误”部分描述了该条目的值。如果操作完成而未遇到任何错误,则此条目不得存在 如果操作包括执行,则响应映射必须包含一个带有键数据的条目。“数据”部分描述了该条目的值。如果操作在执行前由于语法错误、信息缺失或验证错误而失败,则此条目不得存在 响应映射还可能包含一个带有键扩展名的条目。如果设置了此条目,则其值必须为map。这个条目是为实现者保留的,他们可以根据自己的意愿扩展协议,因此对其内容没有额外的限制
为确保将来对协议的更改不会破坏现有服务器和客户端,顶级响应映射不得包含除上述三个项以外的任何项。
formatResponse
是添加这些字段的正确方法。说“没有达到预期效果”并不能描述你的问题。请指定您期望的行为以及遇到的意外行为。我的意思是,即使我返回{data,test}我只在响应中返回数据,但预期的行为是响应包含{data,test}GraphQL,甚至在每个字段级别上,这些错误可以携带扩展值,比如人类可读的消息和机器可读的代码。阿波罗也有一些可能满足你的需要。@Matt看看这个<代码>格式响应按预期工作。如果前端的客户机没有公开这些信息,那是另一个问题。您可以通过打开“网络”选项卡并查看从服务器收到的实际响应来验证是否存在这种情况。如果确实发生了这种情况,则可能应该将此问题改写为“为什么[客户端]不读取我在响应中设置的自定义属性?”
{
data: {
myItems: [ ... fancy Items ... ],
},
message: 'successfully retrieved fancy Items',
code: <CODE_FOR_SUCCESSFUL_QUERY>
}
const server = new ApolloServer({
...
formatResponse({ data }) {
return {
data,
test: 'Property to test if shown in the FrontEnd',
}
}
...
}