我创建了一个express graphql服务器,在解析器中,如果遇到错误,就会抛出一个error对象。这将导致一个带有错误和500 http状态的错误数组。
我为graphql客户端创建了一个使用apollo的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((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的graphql端点,它将所有错误处理为500,结果为
只有当模式本身无效时,快速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);
}