如何在中继中捕获GraphQL错误消息?

如何在中继中捕获GraphQL错误消息?,graphql,relay,graphene-python,relaymodern,Graphql,Relay,Graphene Python,Relaymodern,在我的服务器上,我的GraphQL实现使用Flask、Graphene和SQLAlchemy。理想情况下,我希望能够简单地操作标题并返回401错误响应,但GraphQL将所有内容返回为200 使用flask.abort(401),但我至少能够获得以下响应: ... "errors": [ { "message": "401 Unauthorized: The server could not verify that you are authorized to access the U

在我的服务器上,我的GraphQL实现使用Flask、Graphene和SQLAlchemy。理想情况下,我希望能够简单地操作标题并返回401错误响应,但GraphQL将所有内容返回为200

使用flask.abort(401),但我至少能够获得以下响应:

...
"errors": [
  {
    "message": "401 Unauthorized: The server could not verify that you are authorized to access the URL requested.  You either supplied the wrong credentials (e.g. a bad password), or your browser doesn't understand how to supply the credentials required.",
    "locations": [
      {
      "line": 11,
      "column": 3
      }
    ]
  }
]
...
我认为这是一个妥协,我可以在这个时候与之合作。然而;因为没有什么能这么简单。。。我不确定如何获取此错误消息。我已经读到,
QueryRenderer
本身可能有问题,它会吞下这些GraphQL错误,但我可以设法在
环境中的
网络
对象中拦截它们。。。基本上看起来是这样的

Promise {[[PromiseStatus]]: "resolved", [[PromiseValue]]: {…}}
  __proto__: Promise[
    [PromiseStatus]]: "resolved"
    [[PromiseValue]]: Object
      data: {viewer: {…}}
      errors: Array(4)
        0: {locations: Array(1), message: "401 Unauthorized: The server could not verify that…nderstand how to supply the credentials required."}
        1: {locations: Array(1), message: "401 Unauthorized: The server could not verify that…nderstand how to supply the credentials required."}
        2: {locations: Array(1), message: "401 Unauthorized: The server could not verify that…nderstand how to supply the credentials required."}
        3: {locations: Array(1), message: "401 Unauthorized: The server could not verify that…nderstand how to supply the credentials required."}
      length: 4
      __proto__: Array(0)
    __proto__:Object
我真的不认为在我的环境的网络层处理这个错误是管理这个错误的正确方法。“追问者”似乎是最有意义的。。。我基本上把它设定为真理的唯一来源

顺便说一句,如果不是很明显的话,我用的是现代继电器。因此,基于Relay Classic的任何解决方案都很可能不适用

编辑:撇开错误消息不谈,我这样做的动机是正确处理JWT令牌。我认为我正在寻找的解决方案与处理这些错误响应无关,而是扩展了我对JWT的理解


我没有意识到我的客户可以很容易地使用诸如
JWT decode
这样的包来解码JWT,这样我就可以访问过期信息。。。最终,我预见到这将导致某种形式的中间件实现,它将评估JWT上剩余的时间量以及是否需要刷新。

您可以在
onCompleted
回调中处理服务器错误:

我希望我正确理解您的问题,位您的QueryRenderer应该有一个包含错误的错误对象

render={({error,props})=>{
如果(错误){
返回{error.message};
}否则如果(道具){
return{props.page.name}很棒!;
}
回装;

environment.js
中,修改
fetch
函数,这样,如果JSON响应中存在
errors
数组,您将把它作为一个新的自定义错误抛出。抛出的错误将被传输到
QueryRenderer
中,在那里它将作为
error
属性提供。通过显示与错误相关的U来处理它如果出现错误,我将进行检查

有关详细说明,请参阅GitHub上的此评论:

这些错误假设应用程序没有失败。结果证明,我根本不需要处理错误消息,但仅供参考,它指的是网络级别的环境错误,通常会导致应用程序出现严重故障。不幸的是,我不再将代码片段放在周围进行演示。好的,这很有趣ng所以QueryRender错误只在某些情况下触发,并且来自网络层的一些错误不会传播到QueryRender?这很有趣。感谢您提供的信息。
QueryRender
错误仅在GraphQL有效负载数据为空时才会呈现,否则它将吞噬它……如何使用此
onCompleted
回调?是av吗在Relay Modern上可以找到?在查询中也可以找到吗?在Relay Modern上可以找到。除了文档之外,我无法描述它的用法。它是用于突变的。这是我回答问题时遗漏的一点。
render={({error, props}) => {
if (error) {
  return <div>{error.message}</div>;
} else if (props) {
  return <div>{props.page.name} is great!</div>;
}
return <div>Loading</div>;