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

pup*_*eno 6 relay graphql typegraphql

我对 GraphQL 有点陌生,所以,仍然在我的脑海中将所有活动的部分拼凑在一起。

在我的服务器端,我使用TypeGraphQL,它用于class-validator传入的查询进行验证。在客户端,我使用 Relay。当验证失败时,我commitMutation在 Relay 中的调用会调用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
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我将电子邮件留空,因此errors[0].extensions.exception.validationErrors[0].constraints.isEmail出现错误:“电子邮件必须是电子邮件”。

Relay 有没有办法让我访问这个结构,把这个错误变成用户的 UI 错误?或者这些错误是否相当于 500,我应该实现自己的单独错误处理(相当于 401)?

我在客户端进行大部分验证,但唯一性只能在服务器上完成,我正试图找出两者之间的协议。

Nux*_*Nux 2

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

  const apolloServer = new ApolloServer({
    formatError: (error) => error, 
  });
Run Code Online (Sandbox Code Playgroud)

如果抛出类验证器的错误,上面的错误将是因此,如果错误是您需要正确格式化它的ArgumentValidationError实例,并返回到客户端,并提取所有约束值并将其附加到消息字段上。这样,所有错误在前端都会表现相同。ArgumentValidationError