Apollo GraphQL - 用户友好的类型验证错误

Posted

技术标签:

【中文标题】Apollo GraphQL - 用户友好的类型验证错误【英文标题】:Apollo GraphQL - User-friendly type-validation errors 【发布时间】:2019-12-23 18:25:33 【问题描述】:

我目前正在构建一个将 Apollo 用于我的 GraphQL API 的应用程序。众所周知,GraphQL 为某些字段提供了类型和不可为空的检查。假设我希望 foo 字段是 Int 并且它是不可为空的字段,我们可以在架构(或 typedefs)中这样做

foo: Int!

会产生这种错误

"message": "Variable \"$input\" got invalid value \"foo\"; Expected type Int; Int cannot represent non 32-bit signed integer value: foo"\

但是,假设我想将消息自定义为类似

"message": "Foo is wrong"

是否可以更改默认错误消息?如果您在解析器中检查不可为空,在技术上是可行的,但我认为类型也不可能。

【问题讨论】:

【参考方案1】:

在一定程度上改变标量序列化或解析期间抛出的错误消息的唯一方法是提供这些标量的自定义实现。例如,您可以复制 source code 作为您选择的标量:

const  GraphQLScalarType  = require('graphql')
const inspect = require('graphql/jsutils/inspect').default

function serializeID(rawValue) 
  const value = serializeObject(rawValue);

  if (typeof value === 'string') 
    return value;
  
  if (Number.isInteger(value)) 
    return String(value);
  
  throw new TypeError(`ID cannot represent value: $inspect(rawValue)`);


function coerceID(value) 
  if (typeof value === 'string') 
    return value;
  
  if (Number.isInteger(value)) 
    return value.toString();
  
  throw new TypeError(`Oh no! ID cannot represent value: $inspect(value)`);


const ID = new GraphQLScalarType(
  name: 'ID',
  description:
    'The `ID` scalar type represents a unique identifier, often used to refetch an object or as key for a cache. The ID type appears in a JSON response as a String; however, it is not intended to be human-readable. When expected as an input type, any string (such as `"4"`) or integer (such as `4`) input value will be accepted as an ID.',
  serialize: serializeID,
  parseValue: coerceID,
  parseLiteral(ast) 
    return ast.kind === Kind.STRING || ast.kind === Kind.INT
      ? ast.value
      : undefined;
  ,
)

const resolvers = 
  ID,
  /* the rest of your resolvers */

现在验证消息将改为:

变量 \"$id\" 得到无效值 true;预期的类型 ID;不好了! ID不能代表值:true

但是,无法更改消息的第一部分。

也就是说,验证错误意味着您的代码出现问题,无论是在客户端(验证输入时)还是在服务器端(验证输出时)。用户可能不应该遇到这些错误,而应该显示一些通用的错误消息。

【讨论】:

以上是关于Apollo GraphQL - 用户友好的类型验证错误的主要内容,如果未能解决你的问题,请参考以下文章

Apollo/GraphQL:用于时间戳的字段类型?

从 graphql-codegen 获取类似于 apollo codegen 生成的类型

使用 GraphQL Apollo 忽略该字段

React Native 上的 GraphQL Apollo 类型生成

具有动态键的对象的 Apollo/GraphQL 字段类型

具有动态键的对象的 Apollo/GraphQL 字段类型