簡體   English   中英

express-graphql 對 ios apollo 客戶端無法讀取錯誤的錯誤返回 500 狀態。 解決方案?

[英]express-graphql returns 500 status on errors which ios apollo client cant read the errors. Solution?

我創建了一個 express-graphql 服務器,如果在解析器中遇到錯誤,則會拋出錯誤 object。 這會導致錯誤數組包含錯誤和 500 http 狀態。

我使用 apollo 為 graphql 客戶端創建了一個 swiftui 應用程序。 500 個狀態 go 進入失敗的 function 我無法從服務器讀取錯誤。

我已經考慮將 http 狀態更改為 500 無濟於事。 其他人遇到過這個問題嗎? 如何解決?

在 postman 我得到:

{
    "errors": [
        {
            "message": "Email invalid",
            "locations": [
                {
                    "line": 2,
                    "column": 5
                }
            ],
            "path": [
                "recover"
            ]
        }
    ],
    "data": null,
    "extensions": {
        "runTime": 198
    }
}

在我扔的解析器中

if (!email) {
    throw new HTTP404Error('Email invalid');
}

錯誤 class

class HTTP404Error extends HTTPClientError {
    constructor(message = 'Not found') {
        super(message);
        this.statusCode = 404;
    }
}

在我的catch塊中如下

.catch((e) => {
    if (e instanceof PrismaClientValidationError) {
        throw new HTTP409Error('Validation error');
    } else {
        if (e.code === 'P2002') {
            throw new HTTP409Error('Constraint violation');
        }
        throw new HTTP400Error(e.message);
    }
})

由於該應用程序是混合 rest 和 graphql 服務器,因此 rest 端點(如“metrics”、“healthcheck”)中的所有拋出錯誤均按預期處理。 它只是 graphql 端點 express-graphql 將所有錯誤處理為 500 結果

express-graphql 唯一會拋出 500 錯誤的情況是模式本身無效。 解析器中拋出的錯誤不會發生 - 如果這些是您遇到的唯一錯誤,則狀態仍將為 200。

如果架構無效,則您的服務器不應該開始。 您可以在啟動服務器之前在您的架構上手動調用 validateSchema 並在返回任何錯誤時以錯誤退出您的進程。

const { validateSchema } = require("graphql");

const schemaValidationErrors = validateSchema(schema);
if (schemaValidationErrors.length) {
  console.log('Schema is not valid', schemaValidationErrors);
  process.exit(1);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM