![](/img/trans.png)
[英]What is the difference between apollo server and express-graphql
[英]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.