2017-08-08 50 views
1

在我的服務器上,我的GraphQL實現使用Flask,Graphene和SQLAlchemy。理想情況下,我想能夠簡單地操縱頭和返回401錯誤響應,但GraphQL返回的一切,200如何在Relay中捕獲GraphQL錯誤消息?

使用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錯誤的問題,但我可以設法在Environment中的Network對象中攔截它們......本質上看起來像這樣。

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 

我真的不覺得在我的環境的網絡層處理這個錯誤將是正確的方式來管理這個。 QueryRenderer似乎是最有意義的...我已經將它設置爲實際的單一來源。

如果不是很明顯,我正在使用Relay Modern。因此,基於Relay Classic的任何解決方案都不適用。

編輯:拋開錯誤信息,我的動機是正確處理JWT令牌。我認爲我正在尋找的解決方案與處理這些錯誤響應無關,而是擴大了我對智威湯遜的理解。

我不知道,我的客戶就可以輕鬆地使用包到JWT解碼如jwt-decode,然後讓我訪問過期信息......最終我預見導致我某種形式的中間件實現的這將評估JWT的剩餘時間,以及是否需要更新。

回答

0

您可以處理在onCompleted回調服務器errros:https://github.com/facebook/relay/pull/1938/files

+0

如何將錯誤對象使用這個'onCompleted'callback?它是否適用於Relay Modern?它是否也可用於查詢? – Mendes

+0

它在Relay Modern上可用。我無法描述比文檔更多的用法。這是爲了突變。當我回答這個問題時,這就是我錯過的觀點。 – tkymtk

0

我希望我正確地理解你的問題,咬你的QueryRenderer應該有conains錯誤 https://facebook.github.io/relay/docs/query-renderer.html

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>; 
+0

這些錯誤假定應用程序沒有失敗。事實證明,我並不需要處理錯誤信息,但僅供參考,它指的是網絡級別的環境錯誤,這通常會導致應用程序發生嚴重故障。不幸的是,我不再有片段來展示。 –

+1

確定這很有趣,所以QueryRender錯誤只在某些情況下觸發,並且來自網絡層的一些錯誤不會傳播到QueryRenderer?那很有意思。謝謝(你的)信息。 – liminal18

+0

只有當GraphQL有效載荷數據爲空時,纔會呈現'QueryRenderer'錯誤,否則它將吞下它.... – Mendes