【问题标题】:express-graphql returns 500 status on errors which ios apollo client cant read the errors. Solution?express-graphql 对 ios apollo 客户端无法读取错误的错误返回 500 状态。解决方案?
【发布时间】: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(用户可展示)错误;)显示完整的响应正文

标签: node.js graphql apollo


【解决方案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
猜你喜欢
  • 2021-11-11
  • 2018-08-26
  • 2021-10-12
  • 2019-06-25
  • 2019-03-16
  • 2020-07-22
  • 2019-08-24
  • 1970-01-01
  • 2020-12-27
相关资源
最近更新 更多