express-graphql 对 ios apollo 客户端无法读取错误的错误返回 500 状态。解决方案?
Posted
技术标签:
【中文标题】express-graphql 对 ios apollo 客户端无法读取错误的错误返回 500 状态。解决方案?【英文标题】:express-graphql returns 500 status on errors which ios apollo client cant read the errors. Solution? 【发布时间】:2021-03-28 23:20:02 【问题描述】:我创建了一个 express-graphql 服务器,如果在解析器中遇到错误,则会抛出一个错误对象。这会产生一个错误数组,其中包含错误和 500 http 状态。
我使用 apollo 为 graphql 客户端创建了一个 swiftui 应用程序。 500 个状态进入失败的函数,我无法从服务器读取错误。
我已经考虑在 500 中更改 http 状态,但无济于事。其他人遇到过这个问题吗?如何解决?
在邮递员中我得到:
"errors": [
"message": "Email invalid",
"locations": [
"line": 2,
"column": 5
],
"path": [
"recover"
]
],
"data": null,
"extensions":
"runTime": 198
我在解析器中抛出
if (!email)
throw new HTTP404Error('Email invalid');
错误类
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 服务器,因此在 'metrics'、'healthcheck' 等其余端点中抛出的所有错误都会按预期进行处理。它只是 express-graphql 将所有错误处理为 500 的 graphql 端点
【问题讨论】:
API 致命错误...调试网络请求正文以检查哪些查询(和变量)有问题 - 在服务器游乐场或邮递员中尝试,调试服务器代码 在邮递员中,我得到了 graphql 错误,但 express-graphql 返回了 apollo ios 不喜欢的 500 状态,希望尽可能更改 500 返回状态,或者能够在 apollo ios 客户端中读取它 这是一个网络错误,而不是通常的 graphql 错误(总是 200) - 检查其他错误道具 不是网络错误。 express-graphql 在邮递员中以 500 状态返回错误消息,这是已知的 好的,不是网络错误,但也不是 graphql(用户可展示)错误;)显示完整的响应正文 【参考方案1】: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);
【讨论】:
未处理的异常? 我不确定你在问什么@xadm。在解析器中抛出的任何被拒绝的 Promise 或错误都将被 GraphQL 捕获并在响应中的errors
数组中显示。在这些情况下,express-graphql 仍将返回 200。
未处理表示未捕获,未明确抛出
唯一可能的方法是在孤儿承诺的情况下,未处理的拒绝,但这不会影响响应。
可以是生产环境设置相关github.com/apollographql/apollo-server/issues/1710以上是关于express-graphql 对 ios apollo 客户端无法读取错误的错误返回 500 状态。解决方案?的主要内容,如果未能解决你的问题,请参考以下文章
Express-graphql“在运行突变和查询时无法使用 mongodb 读取未定义的属性‘集合’”
如何在没有 Apollo Server 但使用 express-graphql 的情况下使用 apollo-datasource-rest
使用 Express-GraphQL 的 GraphQL 订阅