我正在寻找一种在发送出去之前修改graphql查询或变异的响应对象的方法。
基本上除了数据对象外,我还希望有其他字段,例如代码和消息。
目前,我正在通过将字段直接添加到我的GQL模式中来解决此问题,例如以这种类型定义为例:
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>
}
}
}
我发现该解决方案不好,因为它会使FrontEnd中的事情变得过于复杂。
我希望将消息代码和其他元数据与实际数据分开的解决方案,如下所示:
{
data: {
myItems: [ ... fancy Items ... ],
},
message: 'successfully retrieved fancy Items',
code: <CODE_FOR_SUCCESSFUL_QUERY>
}
使用apollo服务器,我已经在构造函数中尝试过formatResponse对象:
const server = new ApolloServer({
...
formatResponse({ data }) {
return {
data,
test: 'Property to test if shown in the FrontEnd',
}
}
...
}
不幸的是,这并没有达到预期的效果。在我使用快速中间件之前,我想问一下是否有可能通过apollo服务器开箱即用,或者我是否只是在formatResponse函数中缺少某些东西。
答案 0 :(得分:1)
from graphql.org: 对GraphQL操作的响应必须是映射。
如果操作遇到任何错误,则响应映射必须包含带有关键错误的条目。该条目的值在“错误”部分中描述。如果操作完成而没有遇到任何错误,则该条目不得存在。
如果该操作包括执行,则响应映射必须包含带有关键数据的条目。该条目的值在“数据”部分中描述。如果操作由于语法错误,信息丢失或验证错误而在执行前失败,则该条目不得存在。
响应图可能还包含带有键扩展名的条目。如果设置此条目,则其值必须具有映射。此项保留给实施者以扩展协议,但他们认为合适,因此对其内容没有附加限制。
为确保以后对协议进行的更改不会破坏现有的服务器和客户端,顶级响应映射中不得包含上述三个条目以外的任何条目。
答案 1 :(得分:0)