graphql - 是否可以从 Relay 突变访问 GraphQL 验证错误?

标签 graphql relay typegraphql

我对 GraphQL 有点陌生,所以,我仍然在脑海中将所有事件部件拼凑在一起。
在我的服务器端,我正在使用 TypeGraphQL使用 class-validator对传入的查询执行验证。在客户端,我使用的是中继。当验证失败时,我的 commitMutation调用中继调用onError并传递错误的字符串表示形式,但来自服务器的实际响应如下所示:

{
  "errors": [
    {
      "message": "Argument Validation Error",
      "locations": [
        {
          "line": 2,
          "column": 3
        }
      ],
      "path": [
        "updateCurrentUser"
      ],
      "extensions": {
        "code": "INTERNAL_SERVER_ERROR",
        "exception": {
          "validationErrors": [
            {
              "target": {
                "name": "ueoa",
                "nickname": "ueoa",
                "email": ""
              },
              "value": "",
              "property": "email",
              "children": [],
              "constraints": {
                "isEmail": "email must be an email"
              }
            }
          ],
          "stacktrace": [
            "Error: Argument Validation Error",
            "    at Object.validateArg (C:\\Users\\pupeno\\Documents\\Flexpoint Tech\\imok\\node_modules\\type-graphql\\dist\\resolvers\\validate-arg.js:24:15)",
            "    at runMicrotasks (<anonymous>)",
            "    at processTicksAndRejections (internal/process/task_queues.js:97:5)",
            "    at async Promise.all (index 0)"
          ]
        }
      }
    }
  ],
  "data": null
}
在这种情况下,我将电子邮件留空,因此在 errors[0].extensions.exception.validationErrors[0].constraints.isEmail我有错误:“电子邮件必须是电子邮件”。
Relay 有没有办法让我访问此结构以将此错误转换为用户的 UI 错误?或者这些错误是否相当于 500,我应该实现自己的单独错误处理(相当于 401)?
我在客户端上进行了大部分验证,但唯一性只能在服务器上完成,我试图找出两者之间的协议(protocol)。

最佳答案

我对 中继 了解不多,但我已经使用 Typegraphql 一段时间了。我能说的是,来自 类验证器 的错误与标准错误的嵌套不同(我说的是 throw new Error('this will be different') 。我建议你在后端有一个错误格式化程序函数,这样无论抛出什么类型的错误你可以只返回一个标准的graphql错误。在 Apollo 服务器有格式化错误的选项我相信其他graphql服务器也有一个。这是它的样子

  const apolloServer = new ApolloServer({
    formatError: (error) => error, 
  });
如果抛出 类验证器的 错误,则上面的错误将为 ArgumentValidationError 因此,如果错误是 ArgumentValidationError 的实例,则您需要对其进行正确格式化并返回客户端,并将所有约束值提取并附加到 消息 字段中。这样,所有错误在前端的行为都相同。

关于graphql - 是否可以从 Relay 突变访问 GraphQL 验证错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62568723/

相关文章:

mongodb - 使用多个装饰器将 Type-GraphQL 与 Typegoose 结合起来

javascript - apollo 客户端从存储中删除而不发生突变

graphql - 中继编译器不生成 .graphql 文件

mysql - 如何将 Prisma/GraphQL 连接到现有的 MySQL 数据库(特别是 WordPress)?

javascript - 使用 Relay 更新 React 状态

javascript - ES6 粗箭头和括号 `(...) => ({...})`

node.js - 错误 : Schema must contain uniquely named types but contains multiple types named "DateTime"

javascript - 错误 : Cannot find module 'src/entities/Post'

node.js - 如何使用 GraphQL 的数组模式类型

java - 无法使用 graphql-spring 初始化代理