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 订阅

如何使用 express-graphql 引发多个错误?

Graphql 突变查询不适用于 express-graphql

Express-GraphQL 上的多个过滤器