Node.js 如何在GraphQL中包含变异请求元数据?

Node.js 如何在GraphQL中包含变异请求元数据?,node.js,graphql,Node.js,Graphql,我正在用一个API后端从头开始构建一个GraphQL服务器,替换RESTAPI服务器。当前,现有API服务器中的一些请求(主要是创建/更新GraphQL中的请求)包括客户端使用的请求id。此请求id是关于请求本身的元数据,而不是域资源的一部分 我的问题是如何在GraphQL查询和转换中建模/包含请求元数据?到目前为止,我唯一的解决方案是创建一个请求类型,其他类型可以将其作为字段包含,以便请求数据可以包含在返回类型中。但是,我不喜欢这种方法,因为它将请求数据混合到我的域类型中,这非常有违Graph

我正在用一个API后端从头开始构建一个GraphQL服务器,替换RESTAPI服务器。当前,现有API服务器中的一些请求(主要是创建/更新GraphQL中的请求)包括客户端使用的请求id。此请求id是关于请求本身的元数据,而不是域资源的一部分

我的问题是如何在GraphQL查询和转换中建模/包含请求元数据?到目前为止,我唯一的解决方案是创建一个请求类型,其他类型可以将其作为字段包含,以便请求数据可以包含在返回类型中。但是,我不喜欢这种方法,因为它将请求数据混合到我的域类型中,这非常有违GraphQL的精神。是否有一种可接受的方式在GraphQL中的查询或变异响应中传递“任意”数据,例如非域类型的数据

示例-我想要避免的:

type用户类型{
id:id
名称:String
request:RequestType//将请求数据与用户的域类型混合在一起
}
类型请求类型{
id:id

}
这种元元素通常在每个请求的头中传递。然后,您可以在GraphQL服务器中随意处理它们

例如

//Request Headers
...

X-Request-Id: <Your_Request_Id>

...
//请求头
...
X-Request-Id:
...
更新 头文件是双向工作的,所以在客户端上使用它们也不会有任何问题。无论何时需要,都可以将它们从响应中拉出


但是,如果您真的希望在您的变异响应中使用requestId,那么这是您域的一部分。有一个定制的响应类型并没有什么错,许多现有的GraphQL API都有一个定制的响应类型,比如
LoginResponse
RegisterResponse
,它会围绕您的域对象,但也会在
meta
字段中包含额外的内容,因为GraphQL被设计成协议无关的,您应该使用所选协议的元数据模式。如果您使用的是HTTP,那么应该传递头。如果您使用的是WS/STOMP/MQTT/AMQP,那么可以在每个帧中包含元数据

或者,GraphQL有一个。您可以向extensions对象中的响应添加
请求id
。Apollo使用扩展来缓存、遥测等


我们已经在生产中使用GraphQL大约一年了,我们犯了一个错误,将元数据添加到GraphQL中,这很难管理。不要错过您正在使用的协议功能带来的好处。

谢谢Kashif,问题不是从后端将请求id输入GraphQL,而是从GraphQL输入客户端。我将使用阿波罗作为客户。我需要在通过React Apollo发送到客户机的突变/查询中交付所有响应数据。因此,问题更多的是如何在GraphQL模式中对请求元数据进行建模,这样我就不必将其混合到我的域类型阅读器中。因此,在客户端上使用它们也不会有任何问题。只要在你需要的时候从回复中取出它们就行了。谢谢Kashif的更新。当与Apollo client afterware结合使用时,headers的想法似乎是一个很好的选择,但我也喜欢响应类型,它以一种更为封装的方式解决了这个问题,使所有数据都在GraphQL模式中处理,但不会用不相关的字段污染类型。感谢赛斯的反馈,很高兴听到别人的尝试和错误的结论。我认为这可能是一个很好的选择-将元数据添加到请求头,然后编写一些Apollo客户端后续软件来检查头并将其注入到响应中,可能类似于以下内容:。我一定会进一步探索这条道路。